フーリエ変換した後のグラフについて

24 views (last 30 days)
Kaede
Kaede on 1 Jun 2020
Commented: Shoumei on 3 Jun 2020
参照信号にディーゼルエンジン音を与えLMSアルゴリズムを適応した後,求められた出力信号と所望信号との誤差を誤差関数としてプロットしました.
下の図の黄色が入力,青が誤差信号,オレンジが所望信号をそれぞれFFTしたグラフです.
このグラフを見ても低減できているか確信を得られないため,なにがどうなっていれば低減できているかおしえていただきたくことはできますでしょうか.
よろしくお願いいたします.
  6 Comments
Shoumei
Shoumei on 3 Jun 2020
人間の聴覚で認識するノイズ削減をしたいのであれば、人間の聴覚に近いログスケールで見たほうが良いと思います。表示するときはplotではなく、semilogxを使ってみると良いと思います。
また、プログラムcomplete.mを拝見したところ、元の時間軸データ点数287925点に対して、fft点数が1024点になっていました。そうすると1025点目以降のデータはFFTに含まれないことになりますので、FFT点数は指定せずに使ったほうが良いと思います。
また、適応フィルタというのは、最初は効いておらず、時々刻々とノイズが減ってくるような応答をすると思いますので、FFTで静的な解析をするより、スペクトログラムなどで時間応答を確認したほうが良いと思います。
例があるのでご覧ください。
プログラムの一部を書き直すと、以下のような特性が得られました。
31, 35, 50Hzの周期ノイズ、残念ながら消えてませんね。
win = hamming(length(d1));
d1win = win.*d1';
e1win = win.*e1';
y1win = win.*y1';
% データは287925点ありますが、FFTを1024点で行うと
% 1025点目以降のデータは切り捨てられます。
% FFT点数を指定せずにデータ点数でDFTを行うようにして使いましょう。
fft_e1=fft(y1);
dB_e1=mag2db(abs(fft_e1));
fft_d1=fft(d1);
dB_d1=mag2db(abs(fft_d1));
fft_y1=fft(y1);
dB_y1=mag2db(abs(fft_y1));
f = (0:length(fft_e1)-1)*fs/length(fft_e1);
figure
semilogx(f,dB_e1)
xlim([0 fs/2])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_d1)
semilogx(f,dB_y1)
grid on, hold off
legend('Error signal','Desired signal','Output signal');
あと、目的と理由をちゃんと考えてやりましょうね。

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!