自定义函数介绍
在做通信系统仿真时,我们常常需要画出信号的频谱图来进行信号的分析,但是MATLAB中只提供了 fft 函数,因此每次总要写出几条语句来画出信号的频谱,十分不方便。所以我自己写了一个频谱绘制函数 SpecPlot ,可以用来绘制单边频谱或者双边频谱。
函数实现代码
function SpecPlot(signal,fs,bandtype)
% signal为输入信号
% fs为采样频率(高于两倍信号频率)
% bandtype为频谱绘制选择信号,'single'为单边频谱,'double'为双边频谱
if nargin < 2
fprintf('error,使用open SpecPlot命令语句进行查看\n');
return
end
if nargin == 2 % 默认画双边频谱
bandtype = 'double';
end
len = length(signal); % 信号长度
mag = abs(fftshift(fft(signal))); % 频谱幅度|F(e^jw)|
mag = mag/max(mag); % 归一化
if (strcmp(bandtype,'single'))
f = [0:len/2]*fs/len; % 所画频谱横坐标范围为[0:fs/2]
figure
semilogy(f,mag(round(len/2):len));title('频谱图');xlabel('f/Hz');ylabel('|X(f)|');
else
f = [-len/2:len/2-1]*fs/len; % 所画频谱横坐标范围为[-fs/2:fs/2]
figure
semilogy(f,mag);title('频谱图');xlabel('f/Hz');ylabel('|X(f)|');
end
end
该函数怎么用
创建一个新的 .m 文件,复制函数代码到新建的文件中,注意文件名与函数名应该一致,因此应该保存为 SpecPlot.m 。将该文件放在主程序目录下就可以,主程序就可以对该函数进行调用。调用格式如下:
SpecPlot(signal,fs,bandtype);
- signal 为输入信号,即需要画频谱的信号。
- fs 为采样信号,一般需要大于两倍的信号最高频率。
- bandtype 字符串类型,选择单边频谱或者双边频谱,对应 ‘single’ 或者 ‘double’ ,默认为 ‘double’ 。
函数调用实例
以两个正弦函数为例,两个信号频率分别为150Hz、200Hz,采样频率为500Hz,画出:
- 150Hz信号的双边频谱
- 和两个信号叠加后的单边频谱
%% 演示SpecPlot函数
close all;clc;clear all;
fs = 500; % 采样频率
fc1 = 150; % x1信号频率
fc2 = 200; % x2信号频率
t = [0:1/fs:10]; % 时间,注意间隔以采样频率fs为准
x1 = sin(2*pi*fc1*t); % 频率为fc1的正弦信号
x2 = sin(2*pi*fc2*t); % 频率为fc2的正弦信号
SpecPlot(x1,fs,'double'); % x1双边频谱
SpecPlot(x1+x2,fs,'single'); % x1和x2叠加信号单边频谱
结果演示
150Hz正弦信号双边频谱图:
150Hz和200Hz正弦波叠加信号单边频谱图:
结论
可以看到画出来的图满足理论频谱。大家可以根据自己的需求对函数进行修改,使画出来的频谱更加美观。