2017-08-03 13 views
0

私は、ほぼ正弦波のデータを生成するが、周波数はわずかに変化します。私はMATLABを使って時間依存性を特徴づけるためにいくつかのコードを試作していますが、いくつかの問題があります。スライディングウィンドウFFTを使用して時間に依存する周波数を決定する

私はF(T)変数で、、I(T)=罪(2パイF(t)はt)を私のデータの理想的な近似値を生成するが、現在の直線として試験や二次ています。私は、フーリエ変換のセットがFデータポイントに対応する[I(t)は、T ']を変換生成する(幅ワットの)スライディングハミング窓を実装I(T)、各F [I(t)、t ']はピーク位置をより正確に決定するためにガウス分布に適合しています。

私の現在のMATLABコードは、次のとおり

fs = 1000; %Sample frequency (Hz) 
tlim = [0,1]; 
t = (tlim(1)/fs:1/fs:tlim(2)-1/fs)'; %Sample domain (t) 
N = numel(t); 

f = @(t) 100-30*(t-0.5).^2; %Frequency function (Hz) 
I = sin(2*pi*f(t).*t); %Sample function 

w = 201; %window width 
ww=floor(w/2); %window half-width 

for i=0:2:N-w 

    %Take the FFT of a portion of I, convolved with a Hamming window 
    II = 1/(fs*N)*abs(fft(I((1:w)+i).*hamming(w))).^2; 
    II = II(1:floor(numel(II)/2)); 
    p = (0:fs/w:(fs/2-fs/w))'; 

    %Find approximate FFT maximum 
    [~,maxIx] = max(II); 
    maxLoc = p(maxIx); 

    %Fit the resulting FFT with a Gaussian function 
    gauss = @(c,x) c(1)*exp(-(x-c(2)).^2/(2*c(3)^2)); 
    op = optimset('Display','off'); 
    mdl = lsqcurvefit(gauss,[max(II),maxLoc,10],p,II,[],[],op);  

    %Generate diagnostic plots 
    subplot(3,1,1);plot(p,II,p,gauss(mdl,p)) 
    line(f(t(i+ww))*[1,1],ylim,'color','r'); 

    subplot(3,1,2);plot(t,I); 
    line(t(1+i)*[1,1],ylim,'color','r');line(t(w+i)*[1,1],ylim,'color','r') 

    subplot(3,1,3);plot(t(i+ww),f(t(i+ww)),'b.',t(i+ww),mdl(2),'r.'); 
    hold on 
    xlim([0,max(t)]) 
    drawnow 
end 
hold off 

私の思考プロセスは、各F [I(t)は、T ']のピーク位置が中心周波数の近似であるべきであるということですそれを生産するために使われた窓のしかし、これは実験的にはそうではないようです。

過去の工学的な問題のために離散フーリエ解析を使用して成功したことがありますが、私は連続フーリエ変換についての授業を終えてしまっています。また、これはStackExchangeに関する私の最初の質問ですので、建設的な批評は大歓迎です。

+2

ゆっくりと変化する正弦波を追跡しようとしているのであれば、[PLL(Phase Locked Loop)](https:// en .wikipedia.org/wiki/Phase-locked_loop#Implementing_a_digital_phase-locked_loop_in_software)を参照してください。 –

+0

サイドノートでは、この関数[[spectrogram'](https://in.mathworks.com/help/signal/ref/spectrogram.html)を調べることができます。これは、手作業で実装する代わりに、スライディングウィンドウ用のDFT(「短時間フーリエ変換」とも呼ばれます)を計算します。 – crazyGamer

+1

私のコードはうまくいきましたが、ちょっとした研究の結果、PLLがおそらく私がしようとしているものにもっと応用できるように思えます。 –

答えて

関連する問題