用于高斯函数的 Matlab FFT

标签 matlab fft

我正在尝试通过使用 matlab 的 fft 获得 高斯曲线。问题是,在一种情况下,我尝试通过除以 F=dt.*F./exp(-1i.*nu.*T/2) 来降低噪声的尝试不起作用(img 1)并且在第二种情况下,如果我试图获取 fft 结果的绝对值,我在图表中没有合适的比例(img 2)。

N=512;
T=10;
dt=T/(N-1);
t=linspace(-5,5,N);
f=exp(-t.^2);
F=fft(f);

F1=F(1:N/2+1);
F2=F(N/2+1:N);
F=[F2,F1];

dnu=(N-1)/(N*T);
nuNyq=1/(2*dt);
nu=-nuNyq+dnu*(0:N);
F=dt.*F;
%F=dt.*F./exp(-1i.*nu.*T/2);


y=linspace(-5,5,N);
F2=pi.^(1/2).*exp(-y.^2/4);

hold on
plot(y,F2); 
%plot(nu,real(F),'r');
plot(nu,abs(F),'r');
legend('analiticFT','FFT')
xlim([-5 5])
hold off

图片 1 img. 1

img2 img. 2

最佳答案

您的解析傅里叶变换公式中的缩放比例似乎不太正确。根据this Fourier Transform table on Wikipedia , 连续时域信号的变换

y\left(t\right) = e^{-a t^2}

Y\left(f\right) = \sqrt{\frac{\pi}{a}} \cdot e^{-\frac{\left(\pi f\right)^2}{a}}

在你的情况下 a=1。相应的,你应该比较时域信号的FFT

t=linspace(-5,5,N);
f=exp(-t.^2);

用解析傅里叶变换

F2 = sqrt(pi)*exp(-(pi*y).^2);

因此,绘制与以下内容的比较:

hold off;
plot(y,F2); 
hold on;
plot(nu,abs(F),'r');
legend('analiticFT','FFT')
xlim([-5 5])

产量:

enter image description here

现在我们已经为比较建立了适当的基础,我们可以看看为什么 img 1 会出现振荡。简而言之,您生成的引用高斯脉冲 f=exp(-t.^2);t=0 处有一个峰值。相应的“零” 离散时间瞬间自然是数组中的第一个索引(索引 1)。但是在您的数组中,此峰值出现在索引 N/2 处。下Shift theorem ,这会在频域中产生一个额外的 exp(-pi*j*k) 项,导致您看到的振荡。要解决此问题,您应该使用 ifftshift 将高斯脉冲移回:

F=fftshift(fft(ifftshift(f)));

关于用于高斯函数的 Matlab FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367889/

相关文章:

ide - 在 Matlab 中,如何使用命令移动文档栏?

arrays - 以特定方式创建由矩阵重复组成的 3D 数组

image - 傅立叶移位定理matlab

matlab - matlab中的svmtrain和fitcsvm有什么区别?

matlab - 由凸包创建的曲面上点值的插值

matlab - 如何解决此错误: “plot: Wrong size for input arguments #2 and #3: Incompatible dimensions.”?

java - 检测音频输入的频率 - Java?

python - FFT去除周期性噪声

python - 如何像 Python numpy.fft.rfft 中那样在 cv::dft 中指定 FFT 长度

android - 使用 FFT 和 Complex 类获取频率 wav 音频