Rimuovi il rumore dal file wav, MATLAB

Ho usato MATLAB come calcolatrice, quindi non sono molto esperto nel programma. Spero che una persona gentile possa guidarmi sulla strada dato che Google attualmente non è mio amico.

Ho un file wav nel link sottostante, dove c’è una voce umana e un po ‘di rumore in sottofondo. Voglio rimuovere il rumore. C’è qualcuno che può dirmi come farlo in MATLAB?

Questa è una soluzione piuttosto imperfetta, soprattutto perché parte del rumore è incorporato nella stessa gamma di frequenze della voce che si sente sul file, ma qui non va nulla. Quello di cui stavo parlando per quanto riguarda lo spettro di frequenza è che se si sente il suono, il rumore di fondo ha un ronzio molto basso. Questo si trova nella gamma delle basse frequenze dello spettro, mentre la voce ha una frequenza più alta. Pertanto, possiamo applicare un filtro passabanda per eliminare il rumore basso, catturare la maggior parte della voce e anche eventuali frequenze rumorose sul lato superiore verranno cancellate.

Ecco i passaggi che ho fatto:

  1. Leggi nel file audio usando audioread .
  2. Riproduci il suono originale in modo che io possa sentire come si usa. Fai questo creando un object audioplayer .
  3. Tracciato sia i canali sinistro che destro per dare un’occhiata al segnale sonoro nel dominio del tempo … se fornisce qualche indizio. Guardando i canali, sembrano entrambi uguali, quindi sembra che sia stato mappato un solo microfono su entrambi i canali.
  4. Ho preso la trasformazione di Fourier e ho visto la distribuzione di frequenza.
  5. Usando (4) ho trovato la approssimazione approssimativa di dove dovrei tagliare le frequenze.
  6. Progettato un filtro passabanda che taglia queste frequenze.
  7. Filtrato il segnale quindi riprodotto costruendo un altro object audioplayer .

Andiamo allora!


Passo 1

 %% Read in the file clearvars; close all; [f,fs] = audioread('Hold.wav'); 

audioread leggerà in un file audio per te. Basta specificare quale file si desidera all’interno di '' . Inoltre, assicurati di impostare la directory di lavoro in cui si trova questo file. clearvars, close all basta fare pulizia per noi. Chiude tutte le nostre windows (se ne sono aperte) e cancella tutte le nostre variabili nello spazio di lavoro MATLAB. f sarebbe il segnale letto in MATLAB mentre fs è la frequenza di campionamento del segnale. f ecco una matrice 2D. La prima colonna è il canale sinistro mentre il secondo è il canale destro. In generale, il numero totale di canali nel file audio è indicato dal numero totale di colonne in questa matrice letto attraverso audioread .

Passo 2

 %% Play original file pOrig = audioplayer(f,fs); pOrig.play; 

Questo passaggio ti consentirà di creare un object audioplayer che prende il segnale letto in ( f ), con la frequenza di campionamento fs e genera un object memorizzato in pOrig . Quindi si usa pOrig.play per riprodurre il file in MATLAB in modo da poterlo ascoltare.

Passaggio n. 3

 %% Plot both audio channels N = size(f,1); % Determine total number of samples in audio file figure; subplot(2,1,1); stem(1:N, f(:,1)); title('Left Channel'); subplot(2,1,2); stem(1:N, f(:,2)); title('Right Channel'); 

stem è un modo per tracciare punti discreti in MATLAB. Ogni punto nel tempo ha un cerchio disegnato nel punto con una linea verticale tracciata dall’asse orizzontale a quel punto nel tempo. subplot è un modo per posizionare più figure nella stessa finestra. Non ci entrerò qui, ma puoi leggere come funziona la subplot in dettaglio facendo riferimento a questo post StackOverflow che ho scritto qui . Il codice sopra riportato produce la trama mostrata di seguito:

segnali

Il codice sopra è abbastanza semplice. Sto solo tracciando ogni canale individualmente in ogni sottotrama.

Passaggio 4

 %% Plot the spectrum df = fs / N; w = (-(N/2):(N/2)-1)*df; y = fft(f(:,1), N) / N; % For normalizing, but not needed for our analysis y2 = fftshift(y); figure; plot(w,abs(y2)); 

Il codice che apparirà più spaventoso è il codice sopra. Se ricordi da segnali e sistemi, la frequenza massima rappresentata nel nostro segnale è la frequenza di campionamento divisa per 2. Questa è chiamata la frequenza di Nyquist . La frequenza di campionamento del file audio è 48000 Hz, il che significa che la frequenza massima rappresentata nel file audio è 24000 Hz. fft acronimo di Fast Fourier Transform . Consideralo un modo molto efficiente di calcolare la trasformazione di Fourier. La formula tradizionale richiede che si eseguano più sumtorie per ciascun elemento nel proprio output. La FFT calcolerà questo in modo efficiente richiedendo molte meno operazioni e dando comunque lo stesso risultato.

Stiamo utilizzando fft per dare un’occhiata allo spettro di frequenze del nostro segnale. Chiami fft specificando il segnale di input che vuoi come primo parametro, seguito da quanti punti vuoi valutare con il secondo parametro. È consuetudine specificare il numero di punti nella FFT come la lunghezza del segnale. Lo faccio controllando per vedere quante righe abbiamo nella nostra matrice sonora. Quando si traccia lo spettro delle frequenze, ho appena preso un canale per semplificare le cose in quanto l’altro canale è lo stesso. Questo serve come primo input in fft . Inoltre, tieni presente che sono diviso per N poiché è il modo corretto di normalizzare il segnale. Tuttavia, poiché vogliamo solo scattare un’istantanea su come è il dominio della frequenza, non è davvero necessario farlo. Tuttavia, se hai intenzione di usarlo per calcolare qualcosa più tardi, devi assolutamente farlo.

Ho scritto un po ‘di codice aggiuntivo in quanto lo spettro per impostazione predefinita non è centrato . Ho usato fftshift modo che il centro si fftshift a 0 Hz, mentre la sinistra si estende da 0 a -24000 Hz mentre la destra si estende da 0 a 24000 Hz. Questo è intuitivamente come vedo lo spettro di frequenze. Puoi pensare alle frequenze negative come frequenze che si propagano nella direzione opposta. Idealmente, la distribuzione di frequenza per una frequenza negativa dovrebbe essere uguale alla frequenza positiva. Quando si traccia lo spettro delle frequenze, viene indicato quanto contributo ha la frequenza all’output. Questo è definito dalla grandezza del segnale. Lo trovi prendendo la funzione abs . L’output che ottieni è mostrato sotto.

inserisci la descrizione dell'immagine qui

Se guardi la trama, ci sono molti picchi attorno alla gamma delle basse frequenze. Questo corrisponde al tuo ronzio mentre la voce probabilmente si associa alla gamma di frequenze più alte e non ce n’è molta perché non c’è molta voce.

Passaggio n. 5

Per tentativi ed errori e guardando il punto # 5, ho calcolato che tutto a partire da 700 Hz e verso il basso corrisponde al ronzio mentre i contributi di rumore più alto vanno da 12000 Hz e oltre.

Passaggio n. 6

Puoi utilizzare la funzione butter da Signal Processing Toolbox per aiutarti a progettare un filtro passa-banda. Tuttavia, se non si dispone di questa casella degli strumenti, fare riferimento a questo post StackOverflow sul modo in cui la funzione creata dall’utente ottiene la stessa cosa. Tuttavia, l’ordine per quel filtro è solo 2. Supponendo di avere la funzione butter disponibile, è necessario capire quale ordine si desidera il filtro. Maggiore è l’ordine, maggiore sarà il lavoro. Ho scelto n = 7 per iniziare. Devi anche normalizzare le tue frequenze in modo che la frequenza di Nyquist sia mappata a 1, mentre tutte le altre mappe sono tra 0 e 1. Una volta fatto, puoi chiamare il butter modo:

 [b,a] = butter(n, [beginFreq, endFreq], 'bandpass'); 

Il flag bandpass significa che si desidera progettare un filtro passa-banda, la mappa beginFreq e endFreq sulla frequenza di inizio e fine normalizzata che si desidera per il filtro passa-banda. Nel nostro caso, è beginFreq = 700 / Nyquist e endFreq = 12000 / Nyquist . b,a sono i coefficienti utilizzati per un filtro che ti aiuteranno a svolgere questa attività. Avrai bisogno di questi per il prossimo passo.

 %% Design a bandpass filter that filters out between 700 to 12000 Hz n = 7; beginFreq = 700 / (fs/2); endFreq = 12000 / (fs/2); [b,a] = butter(n, [beginFreq, endFreq], 'bandpass'); 

Passaggio n. 7

 %% Filter the signal fOut = filter(b, a, f); %% Construct audioplayer object and play p = audioplayer(fOut, fs); p.play; 

Usa il filter per filtrare il segnale usando quello che hai ottenuto dal passaggio 6. fOut sarà il tuo segnale filtrato. Se vuoi ascoltarlo, puoi build e audioplayer basato su questo segnale in uscita alla stessa frequenza di campionamento dell’input. Quindi usa p.play per ascoltarlo in MATLAB.

Dare una prova e vedere come funziona. Probabilmente avrai bisogno di giocare al massimo nei passaggi 6 e 7. Questa non è una soluzione perfetta, ma spero di farti iniziare, spero.

In bocca al lupo!