1

MATLAB を使用してハーモニック プロダクト スペクトルを実装し、ハーモニクスの存在下でノートの基本周波数を見つける方法を教えてもらえますか?? 私は自分の信号を何度もダウンサンプリングし(もちろんfftを実行した後)、元の信号で乗算することになっていることを知っています。

私のfft信号が「FFT1」であるとしましょう

コードはおおよそ次のようになります

hps1 = downsample(FFT1,2);
hps2 = downsample(FFT1,3);

hps = FFT1.*hps1.*hps2;

このコードは正しいですか?適切にダウンサンプリングしたかどうかを知りたいのですが、各変数の長さが異なるため、それらを乗算すると行列次元エラーが発生します..プロジェクトの作業のため、本当に迅速な助けが必要です...本当に必死です....ありがとうあらかじめ....

4

1 に答える 1

2

"hps = FFT1.*hps1.*hps2;"ダウンサンプリングされたデータごとに行うことはできません。サイズが異なりますか...

5つの高調波デシメーション(ダウンサンプル)を使用して非常に単純な高調波積スペクトル(HPS)を作成する方法の例を示しました。正弦波信号でテストするだけで、テストで基本周波数に非常に近くなります。

このコードは、アルゴリズムの主要なステップを計算する方法のみを示しています。改善が必要になる可能性が非常に高いです。

ソース:

%[x,fs] = wavread('ederwander_IN_250Hz.wav');

CorrectFactor = 0.986;
threshold = 0.2;

%F0 start test
f  = 250;
fs = 44100;

signal= 0.9*sin(2*pi*f/fs*(0:9999)); 
x=signal';

framed = x(1:4096);

windowed = framed .* hann(length(framed));

FFT = fft(windowed, 4096);

FFT = FFT(1 : size(FFT,1) / 2);

FFT = abs(FFT);

hps1 = downsample(FFT,1);
hps2 = downsample(FFT,2);
hps3 = downsample(FFT,3);
hps4 = downsample(FFT,4);
hps5 = downsample(FFT,5);

y = [];

for i=1:length(hps5)

      Product =   hps1(i)  * hps2(i) * hps3(i) * hps4(i) * hps5(i);
      y(i) = [Product];
end

[m,n]=findpeaks(y, 'SORTSTR', 'descend');

Maximum = n(1);

 %try fix octave error
if (y(n(1)) * 0.5) > (y(n(2))) %& ( ( m(2) / m(1) ) > threshold )

    Maximum  = n(length(n));

end

F0 =  ( (Maximum / 4096) * fs ) * CorrectFactor 

plot(y)

HPS は通常、ピッチが 1 オクターブ上であることを示すエラーを生成します。コードを少し変更します。上記を参照してください :-)

于 2013-11-04T14:54:22.147 に答える