問題が見つかりました
最近、FFT 変換のシミュレーションで問題が突然見つかりました。理想的な正弦波信号の離散フーリエ変換は、下図に示すように、単一パルスのスペクトルになるはずです。
![](https://img-blog.csdnimg.cn/29e542349aa241ee935bdcda4f12bbac.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
その結果、MATLAB の FFT 処理の結果は、それが真実ではないようであることを示し、次の図に示すように、ローレンツ線種を示します。
![](https://img-blog.csdnimg.cn/d11cb3a9f5e1481ca7aeaa4da9a0cb9d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
自分で書いた 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);