前言
通信相关的铁子们想必对傅里叶变换这个概念有所了解,其可以从频域分析信号特性,可以说是通信系统分析和设计的重要依据。然而,傅里叶变换种类繁多,傅里叶级数(FS)、傅里叶变换(FT)、离散时间傅里叶变换(DTFT)、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)等等。概念多了总是容易打架,例如:
- 傅里叶级数(FS)为什么要引入复频谱?其优势在哪?
- 为什么傅里叶变换(FT)的频谱称为谱密度?在拥有谱密度的前提下,如何依据定义还原出时域信号?
- 离散时间傅里叶变换(DTFT)的横坐标为什么是数字频谱?和模拟频率有什么关联和区别?
- 离散傅里叶变换(DFT)的隐含周期性体现在哪里?
- 为什么要引入快速傅里叶变换(FFT)?
为了解释这些问题,纯粹依靠教科书上的数学公式,理解是有些困难的(聪明蛋除外)。因此,我们希望依据Matlab仿真,不仅可以直观理解这些变换之间的关系,体验数学公式背后的隐藏信息,并且,能够建立通信仿真的基本概念,为以后更加复杂的链路级,甚至是系统级通信仿真打下坚实基础。话不多说,我们先从最基本的傅里叶级数开始。
傅里叶级数(FS)的正余弦表示
理论回顾
若
x
(
t
)
x(t)
x(t)是周期性连续时间信号,那么
x
(
t
)
x(t)
x(t)可由三角函数的线性组合表示,即展开为傅里叶级数。设
x
(
t
)
x(t)
x(t)周期为
T
T
T,模拟角频率
Ω
0
=
2
π
T
\Omega_0 = \frac{{2\pi }}{T}
Ω0=T2π,模拟频率
F
=
1
T
=
Ω
0
2
π
F = \frac{1}{T} = \frac{\Omega_0}{{2\pi }}
F=T1=2πΩ0,则傅里叶级数展开表达式为:
x
(
t
)
=
a
0
+
∑
n
=
1
∞
[
a
n
cos
(
n
Ω
0
t
)
+
b
n
sin
(
n
Ω
0
t
)
]
x\left( t \right) = {a_0} + \sum\limits_{n = 1}^\infty {\left[ {{a_n}\cos \left( {n{\Omega_0}t} \right) + {b_n}\sin \left( {n{\Omega_0}t} \right)} \right]}
x(t)=a0+n=1∑∞[ancos(nΩ0t)+bnsin(nΩ0t)]
其中,
n
n
n为表示谐波次数。各次谐波成分的幅度值计算如下:
a
0
=
1
T
∫
t
0
t
0
+
T
x
(
t
)
d
t
{a_0} = \frac{1}{{T}}\int\limits_{{t_0}}^{{t_0} + T} {x\left( t \right)dt}
a0=T1t0∫t0+Tx(t)dt
a n = 2 T ∫ t 0 t 0 + T x ( t ) cos ( n Ω 1 t ) d t {a_n} = \frac{2}{{T}}\int\limits_{{t_0}}^{{t_0} + T} {x\left( t \right)\cos \left( {n{\Omega_1}t} \right)dt} an=T2t0∫t0+Tx(t)cos(nΩ1t)dt
b n = 2 T ∫ t 0 t 0 + T x ( t ) sin ( n Ω 1 t ) d t {b_n} = \frac{2}{{T}}\int\limits_{{t_0}}^{{t_0} + T} {x\left( t \right)\sin \left( {n{\Omega_1}t} \right)dt} bn=T2t0∫t0+Tx(t)sin(nΩ1t)dt
通常积分区间为 0 → T 0 \to T 0→T。
当然能够进行傅里叶级数展开的周期信号,必须满足**“Dirichlet”**条件,但是这里并不展开描述。
Matlab仿真验证
上述理论中都是数学公式,很难形成直观印象,并且理解也很难深刻。下面通过Matlab仿真对理论进行验证梳理。
- 步骤1:实现连续周期信号 x ( t ) x(t) x(t)
在实现之前首先考虑两个问题:(1)周期信号的定义域为 ( − ∞ , ∞ ) \left( { - \infty ,\infty } \right) (−∞,∞),Matlab中可能实现吗?(2)连续信号代表时域上由无穷多的取值,这在计算机中可能做到吗?
显然,在仿真中我们无法实现一个满足定义域无穷,且时间取值无穷的信号。因此,我们需要对相关要求进行松弛/替代。(1)周期信号:定义域无穷 → \to →定义域包含整数个周期;(2)连续信号:时域无穷取值 → \to → 采用符号时间变量。
syms t; % 连续时间变量
T = 2; % 周期
periodic_signal = rectangularPulse(t)+rectangularPulse(t-T)+rectangularPulse(t-2*T); % 周期信号
ezplot(periodic_signal,[-0.5, -0.5+3*T]); % 绘制周期信号

- 步骤2:原始定义计算谐波分量,从而进行线性组合
这里采用原始定义进行验证,计算各次谐波对应的幅值,频率并进行线性组合,最终的叠加信号应该逼近原始的周期信号。与步骤1类似,虽然线性组合的谐波项数 n n n应该是无穷,但是在实际仿真中,我们只能取有限项数。
n = 5; % 谐波次数
components = sym('c',[2,n]); % 谐波矩阵
a_0 = 1/T*int(periodic_signal,0,T); % 直流分量
for ii=1:n
a_n = 2/T*int(periodic_signal*cos(ii*2*pi/T*t),0,T); % 余弦分量
b_n = 2/T*int(periodic_signal*sin(ii*2*pi/T*t),0,T); % 正弦分量
components(1,ii) = a_n*cos(ii*2*pi/T*t);
components(2,ii) = b_n*sin(ii*2*pi/T*t);
end
signal_approximate = a_0+sum(sum(components)); % 求和/线性叠加近似
步骤3:绘制
x
(
t
)
x(t)
x(t)和叠加近似信号图像,进行直观验证
在此基础上,进一步增加谐波次数(
n
=
20
n=20
n=20),可以发现逼近效果更好。由此,不难预见,当谐波次数趋近于无穷时,可以完全逼近原始信号
x
(
t
)
x(t)
x(t)。

仿真总结
- 模拟角频率 Ω 0 \Omega_0 Ω0,说的俗一点,就是三角函数里面的角频率。单位:rad/s;物理意义:1s内转动的圈数。这与离散时间傅里叶变换(DTFT)中的数字角频率区别。
- 周期连续信号在实际应用中无法实现,我们更喜欢非周期,离散的信号/函数。
- 依据正余弦定义,从而逼近原始信号 x ( t ) x(t) x(t)需要三个式子计算 a 0 , a n , b n a_0,a_n,b_n a0,an,bn。虽然这已经比较简便了,但是总希望用更少的式子进行计算。因此,我们将引入复频谱表示,这将在下一篇文章中进行验证。
创作不易,希望铁子们可以给出宝贵的建议,这将是我这个小菜猫不断前进的动力,谢谢!
1947

被折叠的 条评论
为什么被折叠?



