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

2024-03-28 07:50

本文主要是介绍MATLAB画信号单边频谱和双边频谱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自定义函数介绍

在做通信系统仿真时,我们常常需要画出信号的频谱图来进行信号的分析,但是MATLAB中只提供了 fft 函数,因此每次总要写出几条语句来画出信号的频谱,十分不方便。所以我自己写了一个频谱绘制函数 SpecPlot ,可以用来绘制单边频谱或者双边频谱。

函数实现代码

function SpecPlot(signal,fs,bandtype)
% signal为输入信号
% fs为采样频率(高于两倍信号频率)
% bandtype为频谱绘制选择信号,'single'为单边频谱,'double'为双边频谱
if nargin < 2fprintf('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]figuresemilogy(f,mag(round(len/2):len));title('频谱图');xlabel('f/Hz');ylabel('|X(f)|');
elsef = [-len/2:len/2-1]*fs/len; % 所画频谱横坐标范围为[-fs/2:fs/2]figuresemilogy(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

结论

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

这篇关于MATLAB画信号单边频谱和双边频谱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854954

相关文章

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客