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 信号处理仿真入门实验 的相关文章

  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • 如何在 Matlab 中使用谷歌翻译?

    我正在编写一个程序 使用 Matlab 列出电影字幕文件中的所有唯一单词 现在我有一个独特的单词列表 我想将其翻译成我的语言并在观看电影之前了解其含义 有谁知道如何在 Matlab 中使用 Google Translate 以便完成我的脚本
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • “Desort”向量(撤消排序)

    在Matlab中 sort返回排序后的向量和索引向量 显示哪个向量元素已移动到以下位置 v ix sort u Here v是一个包含所有元素的向量u 但已排序 ix是一个向量 显示每个元素的原始位置v in u 使用 Matlab 的语法
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • 在不知道大小的情况下在Matlab中预分配空间?

    我正在构建一个向量X在 Matlab 中 通过将循环过程中每次迭代的结果连接起来 我现在正在做的是 X for j 1 N do something that delivers a vector A X X A end 不可能先验地预测 A

随机推荐

  • 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 的对应关系 理解信号加窗的作用