MATLAB 信号处理仿真入门实验

2023-10-31

MATLAB 信号处理仿真入门实验

实验目的:
• 熟悉 Matlab 工具的基本用法
• 掌握 Matlab 代码编写方法
• 理解序列的离散时间傅里叶变换
• 理解 DFT 结果的频谱能量泄露
• 理解 DFT 和 DTFT 的对应关系
• 理解信号加窗的作用
实验内容:
• 任务1、单音正弦信号采样序列的时域绘图
• 任务2、单音正弦信号采样序列的DFT结果绘图
• 任务3、有限长矩形窗序列的DTFT
• 任务4、有限长正弦序列的DTFT
• 任务5、 DTFT 和 DFT 关系探寻
• 最终任务:双音信号频率分析
正弦信号及其采样序列的数学描述如下:
这里写图片描述
仿真中需要设定的信号配置参数:
1. 信号采样率 fs
2. 信号幅度 Amp
3. 正弦信号频率 f
4. 正弦初始相位为 phy
5. 信号采样序列长度 N
任务1、单音正弦信号采样序列的时域绘图
• 按照以下两组配置参数修改代码
• 观察绘制出的信号时域图样
配置参数 1:
f1 = 1000; Amp1 = 1; phy1 = 0; f2 = 7000; Amp2 = 1; phy2 = 0;
配置参数 2:
f1 = 1000; Amp1 = 1; phy1 = 0; f2 = 9000; Amp2 = 1; phy2 = 0;
实验代码:

 % test with Matlab 2016
close all; 
clear;
fig_fname = 'sine_1_tone.jpg';
fs  = 8E3;  % 采样率
N   = 32;   % 向量长度
% 信号频率、幅度、初相位
f1  = 1000; Amp1 = 1; phy1 = 0;
f2  = 7000; Amp2 = 1; phy2 = 0;
% 信号向量的下标索引
n_idx = [0:N-1];
% 生成信号采样序列向量
x1 = Amp1*sin(2*pi*f1/fs*n_idx + phy1);
x2 = Amp2*sin(2*pi*f2/fs*n_idx + phy2);
% 生成绘图的标题文字
str_fs = num2str(fs); str_N = num2str(N);
str_f1   = num2str(f1); str_Amp1 = num2str(Amp1); str_phy1 = num2str(phy1);
str_f2   = num2str(f2); str_Amp2 = num2str(Amp2); str_phy2 = num2str(phy2);
% 合成绘图标题文字
title_str1 = ['f1:', str_f1,'Hz, ', 'fs:', str_fs,'Hz, ' 'N:', str_N, ', Amp1:' str_Amp1, ', Phy1:', str_phy1];
title_str2 = ['f2:', str_f2,'Hz, ', 'fs:', str_fs,'Hz, ' 'N:', str_N, ', Amp2:' str_Amp2, ', Phy2:', str_phy2];

% 绘图
h = figure;

subplot(2,1,1);
plot(n_idx, x1, 'color', 'blue'); % 连线方式绘图
grid on; hold; 
stem(n_idx, x1, 'color', 'red' ); % 离散样值方式绘图
title(title_str1, 'fontsize',14); % 绘制标题文字

subplot(2,1,2);
plot(n_idx, x2, 'color', 'blue'); % 连线方式绘图
grid on; hold;                                       
stem(n_idx, x2, 'color', 'red' ); % 离散样值方式绘图
title(title_str2, 'fontsize',14); % 绘制标题文字

仿真图:
这里写图片描述

配置参数2代码与配置参数1代码相似,只需修改具体数值,下面只给出绘图。

这里写图片描述
• 请回答: 数字信号处理的课本中说数字采样信号的归一化角频率 ω 的数值范围是宽度为 2π 区间,这是为什么?
归一化频率是信号频率除以采样频率的一半,如果将归一化频率转换为角频率,则将归一化频率乘以π ,所以归一化角频率是宽度为2π 的区间。
• 请自行上网搜索关键字“带通采样定理”思考其原理和可行性
带通采样定理:设带通信号m(t),其频率限制在fL与fH之间,带宽为B=fH-fL,如果最小抽样速率fs=2fH/m,m是一个不超过fH/B的最大整数,那么m(t),可以完全由其抽样值确定。
• 任务2、单音正弦信号采样序列的DFT结果绘图
• 离散傅里叶变换 DFT
– 拥有著名的快速算法 — FFT
– DFT的主要用途:分析信号频谱
• 本实验的内容 – 计算确知信号(正弦信号)采样序列的DFT谱
– 设定不同的仿真配置,观察正弦信号的DFT谱
• 改变DFT的计算长度
• 改变输入正弦信号采样序列的频率
• 完成实验后思考问题 – 序列的DFT结果和其连续版本信号的频谱完全一致么?
实验代码:
主函数

% file: sine_1_tone_dft.m
% test with Matlab 2016
close all;
clear;
fig_fname_0 = 'sine_1_tone_dft_0.jpg';
fig_fname_1 = 'sine_1_tone_dft_1.jpg';
fig_fname_2 = 'sine_1_tone_dft_2.jpg';
fs  = 8E3; 
f0_0  = 500; f0_1  = 600; f0_2  = 500; 
N_0   = 32 ; N_1   = 32 ; N_2   = 35 ;

% plot each case
func_sine_1_tone_dft_plot(f0_0, fs, N_0, fig_fname_0);
func_sine_1_tone_dft_plot(f0_1, fs, N_1, fig_fname_1);
func_sine_1_tone_dft_plot(f0_2, fs, N_2, fig_fname_2);


子函数

% test with Matlab 2016
% file: func_sine_1_tone_dft_plot.m
% 绘图程序:绘制信号采样序列的 时域波形,
% 线性尺度DFT幅度谱,对数尺度DFT幅度谱
function func_sine_1_tone_dft_plot(f0, fs, N, fig_fname);
  n_idx = [0:N-1];  % 信号序列的下标向量 
  x = sin(2*pi*f0/fs*n_idx);    % 生成正弦信号序列
  y = abs(fft(x)); y_dB = 20*log10(1E-6+y); % 计算 DFT 结果线性幅度谱及对数幅度谱

  h = figure;
  % 绘图横轴左右边界
  x_left = -1; x_right = N+1;
  % 时域绘图 
  subplot(3,1,1);
  stem(n_idx, x); grid on; hold;
  plot(n_idx, x); xlim([x_left, x_right]);
  xlim([x_left, x_right]);
  title_str = ['f0:', num2str(f0),'Hz, ', 'fs:', num2str(fs),'Hz, ' 'N:', num2str(N)];
  title(title_str, 'fontsize',14);
  % 绘图线性幅度谱
  subplot(3,1,2); stem(n_idx, y); grid on;
  xlim([x_left, x_right]);
  title_str = ['DFT Magtitude Linear Scale, '];
  title_str = [title_str, ' Max:', num2str(max(y)), ', Min:', num2str(min(y))];
  title(title_str, 'fontsize',14);
  % 绘图对数幅度谱
  subplot(3,1,3); stem(n_idx, y_dB);  grid on;
  xlim([x_left, x_right]);
  title_str = ['DFT Magtitude dB Scale, '];
  title_str = [title_str, ' Max:', num2str(max(y_dB)), ', Min:', num2str(min(y_dB))];
  title(title_str, 'fontsize',14);

  print(h, '-djpeg', fig_fname);  % 保存绘图结果文件
end

• 实验代码说明
– sine_1_tone_dft.m : 实验入口代码
– 函数说明
• function func_sine_1_tone_dft_plot(f0, fs, N, fig_fname);
• 功能:绘制正弦信号采样序列的DFT幅度谱,然后保存曲线图
• 参数 f0:正弦信号频率
• 参数 fs :采样率
• 参数 N :序列长度
• 参数 fig_fname:保存的绘图文件名(jpg格式)
仿真图:
这里写图片描述
采样序列中包含了2个完整的信号周期的采样值,DFT幅度谱分析结果有2根峰值谱线,其余位置上均是0。
这里写图片描述
采样序列中包含了2个完整的信号周期,以及 一个不完整信号周期的采样值,DFT幅度谱分析结果有2根极大值谱线,但是其余位置上不为0。
这里写图片描述
采样序列中包含了2个完整的信号周期,以及 一个不完整信号周期的采样值,DFT幅度谱 分析结果有2根极大值谱线,但是其余位置上不为0。
总结规律
– 在采样序列包含整数个信号周期的情况下,信号采样后的DFT分析结果和连续信号的傅里叶变换频谱最相似。
–频谱泄露的最根本原因还在于信号的非周期截断,可以从时域和频域两方面来理解:
(1) 从时域上,傅里叶变换的潜在假设为待处理的有限信号为周期性无限信号的周期主体,即假设原始信号为当前有限信号的无限个周期延拓。因此,举个简单例子。我们截取50HZ 正弦信号的一个周期,其无限延拓就是最原始的50HZ正弦信号,因此一个周期的有限信号即可代表其原始的无限信号;若截取的有限信号不是50HZ信号的整数倍周期,可知该有限信号的无限延拓不可完全的复原原始的50HZ无限信号,其首尾连接处出现断续,从而引入高次谐波分量,产生频谱泄露。
(2)从频域上,假设信号周期T,频率F, 采样周期Ts,采样频率Fs, 采样点数N,则整数周期截断的物理表达为N*Ts = m*T <=> N*1/Fs=m*1/F <=> F=m*Fs/N. 在频域上,Fs对应2π,且频域分辨率为2π/N。 因此F=m*Fs/N意义为信号频率在FFT后的第m根谱线上。反之,当非周期截断时,则无法满足F=m*Fs/N,信号的频率成分分散k*2π/N的频率点上。
由于工程实际处理的信号基本为非平稳多谐波信号,因此频谱泄露不可避免。为了改善频谱泄露,可行的方向包含以下几点:
1. 增大FFT变换的点数N。 通过增大N,一方面提高频域分辨率,更大可能满足F=m*Fs/N, 另一方面,压缩sinc的瓣宽,降低泄露水平。
2. 选用合适的窗函数。根据不同的需求来选择不同特性的窗函数,主瓣宽但旁瓣衰减大的窗或是主瓣窄但旁瓣相对衰减小的窗。
• 任务3、有限长矩形窗序列的DTFT
背景知识:DTFT的重要性
• 计算机的局限性
– 只能计算有限长的数据(无限长的数据,只存在于理论分析的世界里)
– 只能计算离散化的数据(连续变量的函数,计算其函数值时,只能 在离散化的自变量的抽样点上进行)
• 离散时间序列傅里叶变换(DTFT)的重要性
– 在无穷长的尺度上累加
– 输出的结果函数是连续变量函数
– 确定的离散序列,无论有限长、无限长
• 其DTFT变换结果,具有理论唯一性
– 理论唯一性的重要在于:
• 可以使用多种工程计算方法无限逼近
• 可以用来检验工程计算方法的正确性和有效性
实验代码:
主函数:

% file: plot_dtft.m
% test with Matlab 2007
clc 
clear
close all

w_min = -1*pi;
w_max =  1*pi;

w_delta = pi/1000;

n_min =   0;
n_max =   3 ;


n = [n_min:1:n_max];
w = [w_min:w_delta:w_max];

N = length(n);

x = ones(1,N); 
x_dscp_str = 'x(n)';
Y = func_calc_dtft(x, n, w); 

h = func_plot_dtft(x,n,w,Y, x_dscp_str);

子函数1:

% file: func_plot_dtft.m
% test with Matlab 2007
% Y[w] = DTFT(x[n]);
% plot time sequence x[n], real/imag part of Y[w], abs of Y[w]
function h = func_plot_dtft(x,n,w,Y, x_dscp_str);
h = figure; 

N = 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB 信号处理仿真入门实验 的相关文章

  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 对数据进行分布拟合 - MATLAB

    我正在尝试对从显微镜图像中收集的一些数据进行分布 我们知道 152 左右的峰值是由于泊松过程造成的 我想将分布拟合到图像中心的大密度 同时忽略高强度数据 我知道如何将正态分布拟合到数据 红色曲线 但它不能很好地捕获右侧的重尾 尽管泊松分布应
  • 如何将复杂的 csv 文件导入到 Matlab 中的数值向量

    我想知道我们应该如何读取由字符串 双精度数和字符等组成的复杂 csv 文件 例如 您能否提供一个可以在此 csv 文件中提取数值的成功命令 Click here http www ecb europa eu stats money yc d
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 在Matlab中,是否可以终止脚本,但将其所有内部变量保存到工作区?

    我正在运行一个脚本 但它花费的时间太长 所以我想终止该脚本 然而 它计算了很多数据 我理想情况下不想扔掉这些数据 有没有替代方案ctrl C用什么将内部函数变量保存到工作区 理想情况下我正在寻找一个Matlab键盘快捷键如ctrl C 但如
  • 使用循环绘制多个结果

    我想使用 for 循环绘制原始和窗口的结果 10 50 100 全部在一个图中这是我得到的情节 https i stack imgur com wAixM png below is my code Read data in data csv
  • MATLAB 的函数 imfill() 导致错误

    我有一个二进制图像 720x1280 逻辑 其中有一些漏洞 所以我使用imfill来填充它 但是操作失败并且出现以下错误 Undefined function or variable eml assert all constant Erro
  • matlab常量匿名函数仅返回一个值而不是一个数组

    我在网上查了好几天了 没有找到什么 希望能帮到你 我有一个像这样的匿名函数 f x y sin 2 pi x cos 2 pi y cos 2 pi x sin 2 pi y 需要对一系列点进行评估 例如 x 0 0 1 1 y 0 0 1
  • 如何为伪随机数生成器设置自定义种子

    我需要在使用的地方进行一些测试randn伪随机数生成器 我如何自己设置种子 以便每次运行此测试时都会得到相同的结果 是的 我知道这有点奇怪 但这就是问题所在 我找到了RANDSTREAM对象具有seed属性 但它是只读的 有什么方法可以用它
  • 使用 mle() 估计自定义分布的参数

    我有以下代码 我希望估计自定义分布的参数 有关分发的更多详细信息 https stackoverflow com q 56522903 4930944 然后使用估计的参数 我想看看估计的 PDF 是否类似于给定数据的分布 它应该与给定数据的
  • 如何使用 Mikolajczyk 的特征检测器/描述符评估框架?

    我正在尝试使用事实上的标准评估我的 SURF 描述符实现的正确性Mikolajczyk 等人的框架 阿尔 http www robots ox ac uk vgg research affine 我使用 OpenCV 来检测和描述 SURF
  • 评估函数卷积时出错

    这是我第一次尝试用 matlab 编写任何东西 所以请耐心等待 我正在尝试评估以下 ODE 的解 w N w w f t 与柯西条件 w 0 w 0 0 这里 N 是给定的非线性函数 f 是给定的源 我也需要这个功能 其中 G 是以下 OD

随机推荐

  • vue.js执行if语句后程序终止甚至后面的else语句也不会执行

    今天因为前端 vue 的一个问题 耽误了几个小时 本想使用if this sciEngineeringChartData 0 0 id null 进行条件判断 但是程序执行到这里后就不再执行了 本来预想着if语句里面的条件不成立会执行els
  • Java解析zip文件,并识别压缩包里面的文件转换成可操作的IO流

    前几天项目遇到一个棘手的问题 批量上传人员的证件照 因为java操作文件夹不好操作 最后决定把存放人员证件照的文件夹压缩成zip文件 通过java去解析 然后把里面的文件转成list集合 这里使用的jdk提供的 java util zip包
  • Python3链接HIVE

    几个必要的pip 如果用anaconda 安装pyhive的时候会附带都给安装上 pip install pyhive pip install thrift pip install sasl pip install thrift compi
  • PyQt输入部件:QKeySequenceEdit快捷键输入部件简介和使用案例

    PyQt输入部件 QKeySequenceEdit快捷键输入部件简介和使用案例 QKeySequenceEdit是PyQt中的一个输入部件 用于接受用户输入的快捷键序列 它提供了一个用户友好的界面 允许用户直接按下键盘上的按键来定义快捷键
  • python web开发笔记--如何采用uwsgi来部署你的Django项目

    接上一文 python web开发笔记 MAC上Django uwsgi构建总结 最近对于采用uwsgi进行成功部署自己的项目已经成功搞定 因此写下这篇博客 这绝对是一篇值得需要的人读的用心好博文 废话不多少 开始正题 1 进入你的项目目录
  • 阿里云STS获取临时授权

    获取阿里云oss授权 public function sts url https sts aliyuncs com action AssumeRole RoleArn rolearn RoleSessionName client Durat
  • STM32-FreeRTOS源码下载及移植步骤(基于Keil)

    FreeROTS源码获取及基于Stm32移植 获取源码 其实找资料没有那么复杂 官网就是最好的地方了 FreeRTOS的官网是 FreeRTOS官网 当然了 这个网站是全英文的 不过没关系 我们可以简单了解一下 如下图 在这个网页里点击左侧
  • 快速安装最新版Burp Suite Professional

    官网下载链接 https portswigger net burp releases JDK 官方下载 https www oracle com java technologies downloads jdk19 windows 一路默认安
  • 文件的流

    一 文件名词解释 文件 是存贮在某种介质上的 如磁盘 磁带等 并具有文件名的一组有序信息的集合 流设备 大多数的字符设备 如键盘 打印机等 传输的信息均由 一组顺序出现的字符序列组成 文件系统 操作系统对系统的软件资源 不论是应用软件和系统
  • IDEA 项目突然出现异常无法启动时的有效解决办法 ...

    解决方法有效的前提是 项目本身是可以正常启动的 但是因为某些原因无法正常启动 原因包括但不限于以下几种 不小心删除了项目中的文件 导致无法启动 项目很久没更新 更新之后 导致无法启动 项目更新之后出现很多报错信息 导致无法启动 通常做法 根
  • 抖音、快手、B站的广告投放原理

    抖音 快手 B站的广告投放原理 文章目录 抖音 快手 B站的广告投放原理 TOC 文章目录 广告投放原理 编者按 本文来自微信公众号 鸟哥笔记 ID niaoge8 节选自 信息流广告入门 作者 宁阿姨 作者写的挺到位的 相互学习 共同进步
  • Unity网络编程之Photon Server(四)

    前言 上篇我们学习了Unity客户端如何和Photon服务器建立连接 这篇是如何与服务器进行数据的交互 惯例 基于上篇的服务器项目MyGameServer Unity客户端项目进行进一步的学习 客户端与服务器交互流程图解 前面我们有谈到 当
  • MySQL语句优化

    文章目录 1 MySQL的执行顺序 2 基础SQL优化 2 1建表优化 使用varchar代替char 使用 数值 代替 字符串 类型 字段设置为not null 批量插入性能提升 2 2查询优化 select 具体字段 避免在where子
  • 关于Adams View Error MSC_LISENSE_FILE=D:\MSC.......证书错误的解决方案

    首先右键我的电脑 gt 属性 gt 高级系统设置 gt 环境变量 gt 变量名字MSC LICENSE FILE 变量值是lisense dat的地址 在上述操作完成后将lisense dat的名字改为lisense lic
  • String部分方法

    package com javahexin hexin public class string public static void main String args String str dadad String str1 str 判断两
  • 第二十章 Spring5.X bean 的⽣命周期和⼆次处理

    1 Spring bean的 命周期 的init和destroy 法 2 bean的 次加 Spring5 x后置处理器 BeanPostProcessor 什么是BeanPostProcessor 是Spring IOC容器给我们提供的
  • Linux 查看各文件夹大小命令du -h --max-depth=1

    Linux 查看各文件夹大小命令du h max depth 1 du abcDhHklmsSx L lt 符号连接 gt X lt 文件 gt block size exclude lt 目录或文件 gt max depth lt 目录层
  • mysql -n_mysql top n 问题

    日常工作中 经常要查询分组的前几名或查询数据的前几条记录 第5条到第十条 等 TOP N分析法就是通过TOP N算法从研究对象中得到所需的N个数据 并从排序列表中选取最大或最小的N个数据 这就是一个TOP N算法 mysql中用limit
  • (6/300)一阶线性非齐次常微分方程的通解

    一阶线性非齐次常微分方程的通解 首先应该认识方程的形式 dy dx P x y Q x 然后就来思考怎么去解这个方程了 我们最终希望是得到一个y f x 的形式 怎么解呢 先通过线性代数的知识进行引入 求AX b的通解 那么我们先求得A 0
  • MATLAB 信号处理仿真入门实验

    MATLAB 信号处理仿真入门实验 实验目的 熟悉 Matlab 工具的基本用法 掌握 Matlab 代码编写方法 理解序列的离散时间傅里叶变换 理解 DFT 结果的频谱能量泄露 理解 DFT 和 DTFT 的对应关系 理解信号加窗的作用