MATLAB画信号单边频谱和双边频谱

自定义函数介绍

在做通信系统仿真时,我们常常需要画出信号的频谱图来进行信号的分析,但是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正弦信号双边频谱图:
演示1
150Hz和200Hz正弦波叠加信号单边频谱图:
演示2

结论

可以看到画出来的图满足理论频谱。大家可以根据自己的需求对函数进行修改,使画出来的频谱更加美观。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值