機能に問題はありませんchirp
...
ベクトルインデックスではなく、周波数値に対して db_fft をプロットするだけです =)。
plot(linspace(fo,f1,length(db_fft)), db_fft);

また、他の FFT メソッドを使用して信号の FFT を計算することもテストしましたが、それらも 0 ~ 400 Hz の範囲を示しています。
アップデート:
IMO、dBまたはパワー(ピリオドグラム)でプロットしない方が視覚的に簡単だと思います。以下は、時間領域信号の FFT を計算するための優れた例と私の goto メソッドです: mathworks.se/help/matlab/ref/fft.html
応答:
少し考えた後、私は上記の私の答えが間違っていることに同意しますが、あなたが言う理由ではありません. 周波数領域の x 軸は、チャープの実際の長さ (または半分、2 倍、またはそのようなもの) に移動しないでください。周波数領域の x 軸は、信号のサンプリング レートの半分 (Fs/2) に移動する必要があり、希望/希望する最大周波数の 2 倍のサンプリング周波数で信号をサンプリングしていることを確認する義務があります。解決。
言い換えれば、FFT が時間領域信号の長さと同じ/2 倍/半分であると仮定するのは正しくありません。これは、FFT を表すために任意の数の周波数ビンを選択できるためです。ベスト プラクティスは長さ = N^2 ( 2 の累乗) を使用して計算を高速化します。FFT を計算するときに、なぜ時間値を知る必要があるのでしょうか。あなたはそうしない!サンプリング周波数のみが必要です (Fs = 0.001 ではなく、Fs = 1000 btw に設定する必要があります)。
上記の私の答えは正しくありません。次のようにする必要があります。
plot(linspace(0, Fs/2, length(db_fft)), db_fft)
Fs/2 の代わりに、length(t)/(2*Tfinal) と書きました。これは (ほぼ) Fs/2 と同じ値ですが、正しい方法ではありません =)。
これが私のgoto FFTメソッドです(値はdBではありません)。
function [X,f] = myfft(x,Fs,norm)
% usage: [X, f] = myfft(x,Fs,norm);
% figure(); plot(f,X)
% norm: 'true' normalizes max(amplitude(fft))=1, default=false.
if nargin==2
norm=false;
end
L = length(x); NFFT = 2^nextpow2(L);
f = Fs/2*linspace(0,1,NFFT/2+1);
%f =0:(Fs/NFFT):Fs/2;
X = fft(x,NFFT)/L; X = 2*abs(X(1:NFFT/2+1));
if norm==true; X = X/max(abs(X)); end
end
[Xfft, f] = myfft(X,Fs); の結果のグラフは次のとおりです。プロット (f、Xfft); NyQuist の定理に従って、リターン周波数ビン ベクトルは max(f) = Fs/2 であることに注意してください (Fs/2 よりも高い周波数は解決できません)。
