DFT と比較した MATLAB 独自の FFT の誤差

問題が見つかりました

最近、FFT 変換のシミュレーションで問題が突然見つかりました。理想的な正弦波信号の離散フーリエ変換は、下図に示すように、単一パルスのスペクトルになるはずです。

その結果、MATLAB の FFT 処理の結果は、それが真実ではないようであることを示し、次の図に示すように、ローレンツ線種を示します。

自分で書いた DFT 比較

特に信号周波数が整数の場合、誤差が非常に大きくなります。
ここに画像の説明を挿入

信号周波数が分数の場合も異なります。私のMATLABがクラックされたバージョンだからでしょうか?
ここに画像の説明を挿入

手順は次のとおりです。修正を歓迎します

clc;clear;
close all;

T = 1;
fs = 3e3;
len = fs*T;
t = linspace(0,T,len);
I = cos(2*pi*510*t);        % 正弦信号

% MATLAB's FFT
real0 = 2*abs(fft(I))/len;        % fft
freq0 = linspace(0,len-1,len);

% my DFT
real1 = zeros(1,len);
for m = 1:len
    mid = mean(I.*exp(-2i*pi*(m-1)*t));        % 傅里叶变换的公式
    real1(m) = 2*abs(mid);
end
freq1 = linspace(0,len-1,len);

figure,plot(freq1,10*log10(real1),'g',freq0,10*log10(real0),'k');
legend('DFT','FFT');

クラスメートに見てもらったところ、座標ベースが一致しません。時間座標を次のコードに変更するだけです。結果は次のようになります。Niubility!

t = linspace(0,T-1/fs,len);

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/ruredfive/article/details/126128101
おすすめ