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

6 ビュー (過去 30 日間)
Kaede
Kaede 2020 年 6 月 1 日
コメント済み: Shoumei 2020 年 6 月 3 日
参照信号にディーゼルエンジン音を与えLMSアルゴリズムを適応した後,求められた出力信号と所望信号との誤差を誤差関数としてプロットしました.
下の図の黄色が入力,青が誤差信号,オレンジが所望信号をそれぞれFFTしたグラフです.
このグラフを見ても低減できているか確信を得られないため,なにがどうなっていれば低減できているかおしえていただきたくことはできますでしょうか.
よろしくお願いいたします.
  6 件のコメント
Kaede
Kaede 2020 年 6 月 2 日
大変申し訳ないのですが,何で録音したかまでは知らなくてただデータを渡されてこれを入力としてLMSアルゴリズムを適応してみてくださいと言われただけなのでなんとも言えないです.
研究ではディーゼルエンジン音のノック音の低減をやるための準備としてアクティブノイズコントロールを行っているのだと思います.
はい,かしこまりました.今はオンラインで行っているため聞きづらいところがありますが少しづつやってみます。
Shoumei
Shoumei 2020 年 6 月 3 日
人間の聴覚で認識するノイズ削減をしたいのであれば、人間の聴覚に近いログスケールで見たほうが良いと思います。表示するときは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');
あと、目的と理由をちゃんと考えてやりましょうね。

サインインしてコメントする。

回答 (0 件)

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!