フーリエ変換した後のグラフについて
Show older comments
参照信号にディーゼルエンジン音を与えLMSアルゴリズムを適応した後,求められた出力信号と所望信号との誤差を誤差関数としてプロットしました.
下の図の黄色が入力,青が誤差信号,オレンジが所望信号をそれぞれFFTしたグラフです.
このグラフを見ても低減できているか確信を得られないため,なにがどうなっていれば低減できているかおしえていただきたくことはできますでしょうか.
よろしくお願いいたします.

6 Comments
Kaede
on 1 Jun 2020
Shoumei
on 2 Jun 2020
周波数特性を見ても、DC(0Hz)成分が大きく、どれがディーゼルエンジンの信号なのかよくわかりません。
元の信号の取得方法に問題ありませんか?どこの周波数帯の信号を低減させてどのような結果を得たいのでしょうか?
MATLABの勉強はひたすらドキュメントを読んで、例を実行・改造してみました。
Kaede
on 2 Jun 2020
Kaede
on 2 Jun 2020
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');

あと、目的と理由をちゃんと考えてやりましょうね。
Answers (0)
Categories
Find more on スペクトル解析 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!