matlab - (傅里叶变换)简单 DFT 结果与 FFT 不同
问题描述
我想通过自己实现离散傅立叶变换来理解它。虽然我的 DFT 返回的结果不正确,但 matlab 包含的版本会返回原始信号的正确频率。所以问题是,我哪里错了。是数学问题还是实现问题?
%% Initialisation
samples=2000;
nfft = 1024;
K = nfft / 2 + 1;
c = 264;
e = 330;
t = -1:1/samples:1-1/samples;
[~, N] = size(t);
f = (sin(2*c*pi*t)+cos(2*e*pi*t)).*exp(-pi*(2*t-1).^2);
X = zeros(nfft, 1);
%% Discrete Fourier Transform
if true
for k=1:nfft
for n=1:nfft
X(k) = X(k) + f(n)*exp(-j*2*pi*(k-1)*(n-1)/N);
end
end
else
X=fft(f, nfft);
end
R = abs(X(1:K));
[V,I] = sort(R,'descend');
F1 = samples*(I(1)-1)/nfft;
F2 = samples*(I(2)-1)/nfft;
disp(F1)
disp(F2)
plot(1:K, R, 1:K, real(X(1:K)), 1:K, imag(X(1:K)))
解决方案
问题在于完成转换的样本数量。
Xall = fft(f);
plot(abs(Xall(1:500)),'b');
hold on
plot(abs(X(1:500)),'r');
您计算的结果与对所有样本进行的 FFT 的结果相匹配(即输入 4000 个真实样本和输出 4000 个复数值)。
现在,如果您阅读 FFT 的文档,doc fft
您将看到如果输出大小小于输入大小,则信号被截断。如果你试试:
Y = zeros(nfft, 1);
for k=1:nfft
for n=1:nfft
Y(k) = Y(k) + f(n)*exp(-1j*2*pi*(k-1)*(n-1)/nfft);
end
end
Y2 = fft(f(:),nfft); %make it a column
abs(sum(Y-Y2)) %6.0380e-12 , result within precision of the double float format
推荐阅读
- javascript - 固定工具提示调整到屏幕的右边缘
- javascript - 如何在momentjs中获得最后一个中午
- java - 文件中定义的 Spring 属性未解析
- r - 用ggplot标记垂直线
- vb.net - 当我将参数添加到存储过程时,我的 ODP.Net 应用程序崩溃。在我们使用 Microsoft/Oracle 类之前它没有崩溃
- django - DRF 序列化器查询集过滤交叉表
- c# - 如何使用 C# 过滤掉 Active Directory 中的内置用户(访客)和组(管理员)?
- python - 基于列 MySQL 删除重复行
- bash - 从 Crontab 备份 Docker 映像
- asynchronous - 在轮询时唤醒 Rust 未来是否有效?