本学期的信号与系统需要完成一个课程设计,我和两个组员选了一个“信号的采样与重建仿真以及采样定理的验证”这么一个题目。本来是图着简单,三下五除二搞完交差,但没想到的是,开头就发现了不对劲的地方——连续时间信号和离散时间信号的傅立叶变换是连续的,而计算机仿真没有正意义上的连续,因此,matlab上的fft和ifft做的根本不是课本里教给我们的FT。那么,这两个算法到底在干一件什么事情呢?
这部分讨论主要是想表明:理论上连续时间信号与离散时间信号是有关的,连续时间信号是能够被离散时间系统处理的,matlab上能够仿真不是没有理由的。
重点关注一个事实:离散时间的样本的傅立叶变换 X d ( e j Ω ) Xd(e^{jΩ}) Xd(ejΩ)和连续时间信号被单位冲激串采样后的傅立叶变换 X p ( j Ω ) Xp(jΩ) Xp(jΩ)有关频率尺度变化的关系:
X d ( e j Ω ) = X p ( j Ω / T ) = X p ( j Ω ∗ f s ) Xd(e^{jΩ})=Xp(jΩ/T)=Xp(jΩ*{fs}) Xd(ejΩ)=Xp(jΩ/T)=Xp(jΩ∗fs),T是采样周期,fs=1/T是采样频率
我们不去研究它怎么实现的,只简单的讨论一下他到底在干嘛。先看一下官方文档给的公式:从上图可以看出,这两个公式根本就不是书上所说的离散时间信号的傅立叶变换对,而是类似于离散时间的周期信号的分析式和综合式(差了系数1/n),但对我们的分析无关紧要。所以,这两个fft和ifft做的并不是我们脑海里的傅立叶变换与逆变换,而是将离散时间的信号“做了周期延拓”(并不是真的做周期延拓,只是把这个信号当作是离散时间的周期信号的一个周期)。由于我们不可能给计算机输入一个无限时间长度的信号,因此,计算机处理的信号都是有限长时间的离散时间序列。而任何时限信号都可以当作是某个周期信号的一个周期。
在数学上,离散时间信号的傅立叶变换为 X d ( e j ω ) Xd(e^{jω}) Xd(ejω), ω属于实数集,故频谱是连续的,但我们已经清楚意识到计算机无法实现,所以只能另辟蹊径。而解决方法便是:上面所述的将时限的离散时间序列看做是某个离散时间的周期信号的一部分,然后我们去求他的傅立叶级数,但代价是,得到的只是 X d ( e j ω ) Xd(e^{jω}) Xd(ejω)部分的频点,这样也会产生许许多多的问题,具体的下面结合代码来阐释。
第一步:构建一个正弦波信号的样本序列,我们使用matlab的sin()函数,实际上就是对我们脑海里的连续的正弦信号进行采样
fs = 100; %采样率,若一个正弦信号为sin(2*pi*f0*t),则它的奈奎斯特频率为2*pi*f0,由采样定理:2*pi*fs > 2*(2*pi*f0),即fs > 2*f0
N = 128; %样本点的数目,从官方文档中得知,当样本点是2的次幂时,算法的运行速度会相当快
n = 0:N-1;
t = n/fs; %每隔1/fs采样一次
f0 = 10; %正弦信号为10Hz
x = sin(2*pi*f0*t); %采样
subplot(3,1,1);
plot(t,x);
xlabel('时间/s');
ylabel('幅值');
title('时域波形');
grid on;
第二步:对采样得到的样本序列做fft
K = 128
X = fft(x,K);
mag = abs(X); %幅度,注意:fft求出来的幅度并不是真实的连续的信号的ft的幅度,第一部分已经论述
f = (0:K-1)*fs/K; %由于我们的目的是想看连续时间信号的频谱,但是经上面系列步骤之后,fft得到的是离散时间样本序列的频谱,而这两者之间在频率的尺度上是有所不同的,因此我们需要对频率轴做个变换
subplot(3,1,2);
plot(f,mag);
axis([0,100,0,80]);
xlabel('频率/Hz');
ylabel('幅值');
title('幅频谱图');
grid on
第三步:ifft重构样本序列
ifft得出“周期延拓后”的一个周期的值,即样本序列
xifft = ifft(X);
magx = real(xifft);
ti = (0:length(xifft)-1)/fs; %x_d[n]=x_c(nT),故真正的时间坐标为n/fs
subplot(3,1,3);
plot(ti,magx);
xlabel('时间/s');
ylabel('幅值');
title('IFFT后的信号波形');
grid on
参考文献:
[1]:https://blog.csdn.net/YAOHAIPI/article/details/102078741
[2]: https://github.com/bastamon/sound_signal_process-matlab-/blob/master/%E7%AC%AC01%E7%AB%A0%20MATLAB%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/TestProgram.m
[3]: matlab官方手册
[4]:《信号与系统》奥本海姆