私は MATLAB を計算機としてしか使用していないため、プログラムに精通していません。Google は現在私の友達ではないので、親切な人が道を案内してくれることを願っています。
下のリンクにwav
ファイルがあり、バックグラウンドに人間の声とノイズが含まれています。ノイズを除去したい。MATLABでそれを行う方法を教えてくれる人はいますか?
私は MATLAB を計算機としてしか使用していないため、プログラムに精通していません。Google は現在私の友達ではないので、親切な人が道を案内してくれることを願っています。
下のリンクにwav
ファイルがあり、バックグラウンドに人間の声とノイズが含まれています。ノイズを除去したい。MATLABでそれを行う方法を教えてくれる人はいますか?
これはかなり不完全な解決策です。特に、ノイズの一部がファイルで聞こえる音声と同じ周波数範囲に埋め込まれているためですが、ここでは何も起こりません。周波数スペクトルに関して私が話していたのは、音が聞こえる場合、バックグラウンド ノイズのハムは非常に低いということです。これはスペクトルの低周波数範囲に存在しますが、音声はより高い周波数を持っています。そのため、バンドパスフィルターを適用して低ノイズを除去し、ほとんどの音声をキャプチャすることができ、高い側のノイズの多い周波数もキャンセルされます。
私が行った手順は次のとおりです。
audioread
。audioplayer
ます。audioplayer
オブジェクトを作成して再生しました。じゃあ、行きましょう!
%% Read in the file
clearvars;
close all;
[f,fs] = audioread('Hold.wav');
audioread
音声ファイルを読み込みます。内で必要なファイルを指定するだけです''
。また、作業ディレクトリをこのファイルの保存場所に設定してください。 clearvars, close all
私たちのために片付けてください。すべてのウィンドウ (開いている場合) を閉じ、MATLAB ワークスペース内のすべての変数をクリアします。 f
は MATLAB に読み込まれた信号で、 は信号fs
のサンプリング周波数です。 f
これは 2D マトリックスです。最初の列は左チャンネルで、2 番目の列は右チャンネルです。一般に、オーディオ ファイルのチャネルの総数は、 から読み取ったこの行列の列の総数で示されますaudioread
。
%% Play original file
pOrig = audioplayer(f,fs);
pOrig.play;
この手順によりaudioplayer
、( ) で読み取った信号をf
サンプリング周波数fs
で受け取り、 に格納されたオブジェクトを出力するオブジェクトを作成できますpOrig
。次にpOrig.play
、MATLAB でファイルを再生して聞くことができます。
%% 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
は、MATLAB で離散点をプロットする方法です。各時点には、その時点に円が描かれ、横軸からその時点まで垂直線が引かれます。 subplot
同じウィンドウに複数の図を配置する方法です。ここでは触れませんが、ここに書いたこの StackOverflow の投稿をsubplot
参照することで、どのように機能するかを詳しく読むことができます。上記のコードは、以下に示すプロットを生成します。
上記のコードは非常に簡単です。各サブプロットで各チャネルを個別にプロットしているだけです。
%% 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));
最も恐ろしく見えるコードは、上記のコードです。信号とシステムから思い出すと、信号で表される最大周波数は、サンプリング周波数を 2 で割ったものです。これは、ナイキスト周波数と呼ばれます。オーディオ ファイルのサンプリング周波数は 48000 Hz です。これは、オーディオ ファイルで表される最大周波数が 24000 Hz であることを意味します。高速フーリエ変換fft
の略です。フーリエ変換を計算する非常に効率的な方法と考えてください。従来の式では、出力の各要素に対して複数の合計を実行する必要があります。FFT は、必要な操作がはるかに少ないため、これを効率的に計算し、それでも同じ結果が得られます。
を使用して、信号の周波数スペクトルfft
を調べます。必要な入力信号を最初のパラメーターとして指定し、続いて 2 番目のパラメーターで評価する点数を指定して呼び出します。FFT のポイント数を信号の長さに指定するのが通例です。これを行うには、サウンド マトリックスに含まれる行の数を確認します。周波数スペクトルをプロットするときは、もう一方のチャネルが同じであるため、簡単にするために 1 つのチャネルだけを取り上げました。これは への最初の入力として機能します。また、私がで割ったことを覚えておいてくださいfft
fft
N
信号を正規化する適切な方法であるためです。ただし、周波数ドメインがどのように見えるかのスナップショットを取得したいだけなので、実際にこれを行う必要はありません。ただし、後で何かを計算するために使用する予定がある場合は、必ず使用する必要があります。
デフォルトのスペクトルはuncenteredであるため、追加のコードを書きました。fftshift
中央が 0 Hz にマッピングされ、左が 0 から -24000 Hz の範囲で、右が 0 から 24000 Hz の範囲になるように使用しました。これは直感的に私が周波数スペクトルを見る方法です。負の周波数は、反対方向に伝播する周波数と考えることができます。理想的には、負の度数の度数分布は正の度数と等しくなければなりません。周波数スペクトルをプロットすると、その周波数が出力にどれだけ寄与しているかがわかります。これは、信号の大きさによって定義されます。これは、関数を使用して見つけることができabs
ます。得られる出力を以下に示します。
プロットを見ると、低周波数範囲の周りに多くのスパイクがあります。これはあなたのハミングに対応していますが、声はおそらくより高い周波数範囲にマッピングされており、声があまり聞こえないため、それほど多くはありません。
試行錯誤とステップ 5 を見ると、700 Hz 以下のすべてがハミング ノイズに対応し、より高いノイズの寄与は 12000 Hz 以上になることがわかりました。
butter
Signal Processing Toolboxの関数を使用して、バンドパス フィルターを設計できます。ただし、このツールボックスがない場合は、同じことを実現するユーザー作成関数について、この StackOverflow の投稿を参照してください。ただし、そのフィルターの次数は 2 のみです。butter
関数が使用可能であると仮定すると、フィルターに必要な次数を把握する必要があります。次数が高いほど、より多くの作業が行われます。私は始めることを選びますn = 7
。また、ナイキスト周波数が 1 にマップされ、他のすべてが 0 と 1 の間にマップされるように、周波数を正規化する必要があります。これを行うと、次butter
のように呼び出すことができます。
[b,a] = butter(n, [beginFreq, endFreq], 'bandpass');
このbandpass
フラグは、バンドパス フィルターを設計し、バンドパス フィルターに必要な正規化された開始周波数と終了周波数beginFreq
にendFreq
マップすることを意味します。私たちの場合、それはbeginFreq = 700 / Nyquist
とendFreq = 12000 / Nyquist
です。 b,a
は、このタスクの実行に役立つフィルターに使用される係数です。これらは次のステップで必要になります。
%% 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');
%% Filter the signal
fOut = filter(b, a, f);
%% Construct audioplayer object and play
p = audioplayer(fOut, fs);
p.play;
filter
ステップ #6 で取得したものを使用して信号をフィルター処理する ために使用します。fOut
フィルタリングされた信号になります。再生を聞きたい場合はaudioplayer
、入力と同じサンプリング周波数でこの出力信号に基づいて作成できます。p.play
その後、MATLAB でそれを聞くために使用します。
これをすべて試して、すべてがどのように機能するかを確認してください。おそらく、ステップ #6 と #7 で最も多くのことをいじる必要があります。これは完璧な解決策ではありませんが、始めるには十分だと思います。
幸運を!