这是好久之前写的,忘记发了,另一种模拟傅里叶变换的方式。相关阅读:Matlab模拟傅里叶变换

前言

前文进行了傅里叶变换的分析,以及在Matlab上模拟傅里叶变换,但是使用的是矩阵向乘法,这里提供另外一种模拟的方法。

解决方法

我就是在Evaluating Fourier Transforms with MATLAB这篇文章中找到答案的。

我发现在这篇文章中,使用了一个Matlab built-in function—trapz

1
2
3
>> help trapz
trapz Trapezoidal numerical integration.
...

简单来说,这个函数的作用是做积分,之前没有使用这个函数的时候,使用的就是求和的方法,也不知道之前的方法对复指数信号不适合的原因是不是求和导致了信息丢失。

下面进入主题

分析与实现

首先还是看到傅里叶变换上来

$$
X_a(j\Omega)=\int x_a(t)e^{-j\Omega t}dt
$$

思路很清晰,就是对$x_a(t)e^{-j2\pi ft}$积分而已

我们需要使用到的trapz的更详细的描述如下

1
2
3
Q = trapz(X,Y) 根据 X 指定的坐标或标量间距对 Y 进行积分。
如果 X 是坐标向量,则 length(X) 必须等于 Y 的大小不等于 1 的第一个维度的大小。
如果 X 是标量间距,则 trapz(X,Y) 等于 X*trapz(Y)。

根据文档,使用trapz(X,Y)时,让X为t,Y为积分部分就行

1
trapz(t,x.*exp(-j*2*pi*f*t))

一个简单的trapz例子

接下来就使用trapz来做一个简单的函数的变换

$$
X(jf)=\int^2_2 1e^{-j2\pi f} dt
$$

1
2
3
4
5
6
7
8
9
clear
t=-2:.01:2;
k=0;
for f=-5:.01:5
k=k+1;
X(k)=trapz(t,exp(-j*2*pi*f*t));
end
f=-5:.01:5;
plot(f,X)

效果如下:

这是对一个非周期脉宽信号的变换,得到的结果是我们很熟悉的sinc信号,而且结果是符合理论的。