用Matlab求余弦信号的频谱

如果你是电子信息类专业的学生,一定对频谱这个词听过无数次了,当然求频谱的方法之一就是可以采取快速傅里叶的方法,今天来给大家介绍一种用Matlab对余弦信号求频谱的实际操作。

第一步:构建原始余弦信号

Matlab代码如下:

f = 2.4;          %信号频率hz
fs = 16;          %采样频率hz
N = 16;           %采样点数
t = (0:N-1)/fs;   %采样时间s
y = cos(2*pi*f*t);

我们采用的信号频率是2.4Hz,信号频率就是这个信号周期的倒数,也就是说我们的余弦信号的信号周期是1/2.4s。有一定数学基础的你肯定知道, y = c o s t y=cost y=cost的周期是 2 π 2\pi 2π,而 y = c o s 2 t y=cos2t y=cos2t的周期是 π \pi π,计算方法就是用 π \pi π除以t前面的系数。那么很容易得到2.4Hz(1/2.4s为周期)的余弦信号的表达式就是 y = c o s ( 2 π ∗ 2.4 ∗ t ) y=cos(2\pi*2.4*t) y=cos(2π2.4t)
我们这里还规定采样的频率为16Hz,也就是说如果你想要让它显示出来波形,你必须通过采样才能显示,因为计算机只能显示离散的数据,说白了就是计算机只能处理离散的信号。我们规定的采样时间就是上面的表达式t,也就是0-15/16S。

第二步:画出采样的余弦信号

代码如下:

subplot(211)
plot(t, y);
title('16Hz采样的余弦信号');
xlabel('t/s');
ylabel('y');

结果如下图:
用Matlab求余弦信号的频谱_第1张图片
这里图像不光滑的原因,是因为我们选用的16Hz频率有点低,不过没关系,这样能够看出来效果。

第三步:求频谱并且画图

代码如下:

subplot(212)
y_f = abs(fft(y));
y_f_s = fftshift(y_f);
y = linspace(-fs/2,fs/2-1,N);
plot(f, y_f_s);
title('余弦信号频谱');
xlabel('f/Hz');
ylabel('幅度');

首先我们对y求傅里叶变换,直接用到fft这个函数,这个函数返回的是y对应每个点求出的傅里叶变换,是许多个复数,我们需要取每个复数的模,因为这个模就可以表示能量的大小,也就是幅值。求模和求绝对值用到相同的函数abs。
接着fftshift这步是什么意思呢?首先我们先看下如果不加这步画出来的图像是什么样的。假如代码是下面这样的:

subplot(212)
y_f = abs(fft(y));
f = linspace(0, fs, N);
plot(f, y_f);
title('余弦信号频谱');
xlabel('f/Hz');
ylabel('幅度');

然后你会得到一个神奇的频谱图:
用Matlab求余弦信号的频谱_第2张图片
二点几赫兹?10几赫兹?这频率到底是多少……
那究竟是什么原因造成了这种情况呢?其实罪魁祸首在于fft函数,fft函数返回傅里叶变换的结果时,会在信号的后半部分也就是中心点以后的部分将取值区间倒了过来。为什么他会这么做呢?我觉得这其实也是它迫不得已而为之,因为原来16Hz采样的到的信号在频率fs/2的地方会发生混叠的现象,让我们的fft函数不得不把区间倒过来而避开混叠的部分。所以我们要做的就是把后半部分的区间再反转回来,这时候fftshift函数就闪亮登场了。
用fftshift调整了区间之后,我们还需要构建一个表示频率的x轴,因为频谱的x轴可不是时间,而是频率!用linspace函数我们就简单地构建除了s轴,他的意思是从 − f s / 2 -fs/2 fs/2 + f s / 2 +fs/2 +fs/2取N个值作为s轴。这里没有采用错误代码的0到fs,因为我们用fftshift函数其实把频谱的中心值调整到了0的位置,所以整体的区间也要对应的改变。
最后我们就得到了正确的频谱图:
用Matlab求余弦信号的频谱_第3张图片
大功告成!但是是不是有点小失望,似乎结果并不是2.4,那是因为我们的采样率有限,所以2.4就变成了2。

你可能感兴趣的:(Matlab,频谱,信号处理)