Matlab数字信号处理的仿真系统(具有界面)
基于MATLAB的数字信号处理实验课的一个作业,在这里记录一下。虽然界面做的很丑,但是毕竟第一次做啦。
这是运行程序后的初始界面:
再放三张对应三个功能的运行截图:
接下来就说一下做这个系统的流程啦:
1.首先,打开matlab,点击主页—新建—图形用户界面,选择Blank GUI。并勾选将图形另存为。就会生成一个m文件和一个fig文件。fig文件就是我们要绘制的图形界面。m文件用来写一些回调函数,实现每个空间的逻辑功能。
2.现在就可以开始制作界面啦。每次修改界面时,右键点击.fig文件,选择在GUIDE中打开才可以。这个时候,可以看到左边有一堆控件,button呀面板呀什么的,可以直接拖进界面里。双击已经拖进界面中的控件,打开属性检查器,可以修改控件的样式。比如button上显示的文字,就是修改检查其中的String。 嗯面板是个好东西,加了面板果然看着清楚点。
- 设置好图形界面后,就可以具体实现每个控件的功能了。因此要编写的是CallBack回调函数。右键点击空间—查看回调—callback,会自动跳转到该控件的回调函数。
第一个面板中生成信号的功能,首先点击绘图按钮后,右边轴上绘制时域波形。
所以要在绘图button的callback里实现。下面是绘图的button控件的回调函数。
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
val1 = get(handles.popupmenu1,'value');
handles.Xmin = get(handles.edit2,'String');
handles.Xmax = get(handles.edit3,'String');
handles.Xmin = str2num(handles.Xmin);
handles.Xmax = str2num(handles.Xmax);
handles.x = handles.Xmin:0.5:handles.Xmax;
switch val1case 1handles.y = sin(handles.x);case 2handles.y = sawtooth(handles.x,1); %%width=0.5,产生标准对称三角波; case 3handles.y = square(handles.x); %%产生周期为2π,幅值为±1的方波
end
axes(handles.axes1);
plot(handles.x,handles.y);
handles.y;
grid on;
% fd = (handles.y);
guidata(hObject,handles) %保存handles.y的结构体,使得handles.y在别的函数中也能用到
信号y作为一个变量,在函数中以结构体的形式handles.y出现,并且每次修改后,函数最后一条语句一定要加上guidata(),保存结构体中的变量。
这一段函数,从弹出式菜单中获取到我们选择的是什么信号,并获取文本框中X的范围,绘制时域波形。我在弹出式菜单中设置了三个信号,popupmenu1,handles.edit2,handles.edit3分别是我的弹出式菜单和Xfrom,to这三个控件的Tag,这个很重要,需要改成你要获取内容的相应控件的Tag。对于弹出式菜单,选择第几个选项,val会返回对应的数字。axes1是右边第一个坐标轴的Tag。现在就可以在右边绘制时域波形了。
4.叠加噪声同理。我这里是叠加指定方差和均值的高斯噪声。并再次绘制时域图。
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
avg = get(handles.edit4,'String'); avg = str2num(avg); %获取噪声均值
var = get(handles.edit5,'String'); var = str2num(var); %获取噪声方差
k = length(handles.y); %信号长度
handles.n = normrnd(avg,var,[1 k]); % 生成1×k形式的正态分布的随机数矩阵。
snr = SNR_(handles.y,handles.n+handles.y) %信噪比
handles.yn = handles.y + handles.n; % 带噪信号。
axes(handles.axes1);
plot(handles.yn); %绘图
msgbox(num2str(snr), '信噪比');
grid on;
guidata(hObject,handles) %保存结构体
msgbox用来弹出一个对话框,如上图所演示。内容为该带噪信号的信噪比。信噪比需要自己写一个函数计算(SNR_)
function snr=SNR_singlech(I,In) %其中I是纯信号,In是带噪信号,snr是信噪比
% 计算信噪比函数
% I :original signal
% In:noisy signal(ie. original signal + noise signal)
snr=0;
Ps=sum(sum((I-mean(mean(I))).^2));%signal power
Pn=sum(sum((I-In).^2)); %noise power
snr=10*log10(Ps/Pn);
end
5.接下来就是到频域的变换。也是一样的步骤。从弹出式菜单opupmenu4获取到选择的变换方式,进行变换。
变换button的callback函数
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes2);
val2 = get(handles.popupmenu4,'value');
% sample = handles.y(handles.Xmin:handles.Xmax);
sample = handles.y;
k=length(handles.y);
switch val2case 1[magXK,phaseXK] = DFT_(handles.y);stem(magXK);
% title('DFT Magnitude of x(n) when N = 4');xlabel('k');ylabel('Magnitude Part');axes(handles.axes3);stem(phaseXK);
% title('DFT Phase of x(n) when N = 4');xlabel('k');ylabel('Phase Part');case 2 %%离散余弦变换XK = dct(handles.y);magXK = abs(XK);
% phaseXK = angle(XK) * 180/pi; %angle stem(magXK);case 3 %%小波变换[CA,CD]=dwt(handles.y,'db1','mode','sym');stem(CA);
end
guidata(hObject,handles)
做dft变换到用到了自己写的DFT_h函数。
%用二重循环实现DFT:
function [magXk,phaXk]=DFT_(xn) %define a function
N=length(xn); %信号的长度
WN=exp(-j.*2.*pi./N);
xk=zeros(1,N); %一维矩阵
sum=zeros(1,N); %一维矩阵 for k=1:N %二重循环实现离散傅里叶变换DFTfor n=1:Nsum(n)=xn(n).*WN.^(k.*n);xk(k)=xk(k)+sum(n);endendmagXk = abs(xk);phaXk = angle(xk) * 180/pi; %angle k = 2*k/N; % k in DFT is equal to 2*pi*k/N in DTFT
end
6.第三部分。去噪的callback
在这里插入代码片
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (se GUIDATA)
val3 = get(handles.popupmenu6,'value');axes(handles.axes1);
switch val3case 1 yf = window(handles.yn);plot(yf);grid on;case 2 yf = wavelet(handles.yn);plot(yf);grid on;case 3 yf = LMS(handles.yn);plot(yf);grid on;
end
snr = SNR_ (handles.y,yf);
msgbox(num2str(snr), '信噪比');
guidata(hObject,handles) %保存handles.y的结构体,使得handles.y在别的函数中也能用到
这里用到的三个去噪方法,小波去噪的代码还可以,其他的效果都不太好,就不放出来了。
小波去噪:
function yd =wavelet(y) %define a function
[c,l]=wavedec(y,1,'db1');%用db1小波对原始信号进行1层分解并提取系数
ca1=appcoef(c,l,'db1',1);%提取近似系数
cd1=detcoef(c,l,1);%提取1阶详细系数
cdd1=zeros(1,length(cd1));%对信号进行强制性去噪处理并显示结果
c1=[ca1 cdd1];
s1=waverec(c1,l,'db1');%多层次的一维小波重构
N=2;%N越大,分解的层数越多,则能滤除更多噪声,同时取值过大也会导致信号失真
yd=wden(s1,'rigrsure','h','mln',N,'sym20');%rigrsure阈值信号处理
% figure;
% plot(x,yd);
% xlabel('运动位置');
% ylabel('信号幅值');
% title('小波分析滤波后的信号')
end
功率谱callback:
% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[f1,Sx] = powerspec(handles.yn);
axes(handles.axes5);plot(f1,10*log10(Sx));xlabel('f(Hz)');ylabel('P(dB/Hz)')title('功率谱估计');grid on;
powerspec函数估计功率谱:
function [f1,Sx] = powerspec(xn) %
N = length(xn); fs = 1; M=256; %估计N点序列xn的功率谱Sx
t = (0:N-1)/fsf1=(0:N-1)*fs/N; Sx = zeros(1,N);for index = 1 : Nfor n = 0 : N-1 %求Fourier变换Sx(index) = Sx(index) + xn(n+1)*exp(-1j*n*index*2*pi/N); endSx(index) = abs(Sx(index))*abs(Sx(index))/N; %求功率谱end
% plot(f1,10*log10(Sx));Sx = 10*log10(Sx);
end
Matlab数字信号处理的仿真系统(具有界面)相关推荐
- MATLAB数字信号处理函数
MATLAB数字信号处理函数(自学笔记4) 笔者正在学习matlab的m函数,本文为学习笔记的其中之一.本文主要介绍数字信号处理相关的函数. 文章目录 MATLAB数字信号处理函数(自学笔记4) FI ...
- 基于matlab数字交换网络的仿真,基于MATLAB数字交换网络的仿真
- 55 - 基于 MATLAB 数字交换网络的仿真 燕慧英,时永鹏,王松德 (洛阳师范学院,河南 洛阳 471022) [摘 要]为了帮助学生更好的理解程控数字交换的原理,文章在阐述组成数字交换网络 ...
- MATLAB数字信号处理基础
MATLAB数字信号处理基础 1.波形产生函数 函数 说明 square 方波 sawtooth 锯齿波 sinc sinc函数 diric diric函数 rectpuls 非周期方波 tripul ...
- matlab 85个实用案例勘误,MATLAB数字信号处理85个实用案例精讲.入门到进阶+源代码(无需密码).rar...
[实例简介] 本压缩包包含了MATLAB数字信号处理85个实用案例精讲.pdf以及每一章的实例m文件以及函数,下载即可使用,内无密码设置 [实例截图] [核心代码] MATLAB数字信号处理85个实用 ...
- MATLAB数字信号处理(2)LFM脉冲雷达回波处理仿真
将上学期的"气象雷达原理与系统"课程报告放到blog上. 摘要 线性调频(LFM)信号是应用广泛的一种波形,主要优点是脉冲压缩的形状和信噪比对多普勒频移不敏感,即在目标速度未知的情 ...
- 多速率信号处理专题研讨 matlab,数字信号处理》课程研究性学习报告多速率信号处理专题研讨...
1 / 11 数字信号处理>课程研究性学习报告多速率信号处理专题研讨 时间: 2016-05-30 来源:唯才教育网 本文已影响 人 <数字信号处理>课程研究性学习报告 姓名 学号 ...
- 多速率信号处理专题研讨 matlab,数字信号处理》课程研究性学习报告,多速率信号处理专题研讨...
1/11数字信号处理>课程研究性学习报告,多速率信号处理专题研讨<数字信号处理>课程研究性学习报告姓名学号同组成员指导教师时间多速率信号处理专题研讨[目的]掌握序列抽取运算与内插运算 ...
- matlab数字信号处理实验报告,数字信号处理实验报告(Matlab与数字信号处理基础).doc...
西华大学实验报告(理工类) 开课学院及实验室:电气信息学院 6A-205实验时间 :年月日学 生 姓 名学号成 绩学生所在学院电气信息学院年级/专业/班课 程 名 称数字信号处理课 程 代 码实验项目 ...
- matlab数字信号处理 王彬,MATLAB数字信号处理
前言 第1章 基础知识导论 1.1 MATLAB7.0语言简介 1.1.1 MATLAB7.0语言特点 1.1.2 MATLAB7.0的工作环境 1.1.3 M文件介绍 1.2 MATLAB基本程序控 ...
最新文章
- 工业界常用的三维重建技术有哪些?
- 无线网络未来十年十大产业趋势
- 三关节机械臂控制需求说明压缩文件中的相关文档说明
- python是高级动态编程语言-python是一种跨平台、开源、免费的高级动态编程语言,对么...
- 【运筹学】线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 线性规划求解示例 )
- 在整个数据库中查找包含某关键字的所有存储过程
- 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
- python怎样定义_python dict如何定义
- 两篇 Spring 总结(一)
- 用php的for循环画椭圆,如何快速简单的使用css3画出各种各样的椭圆
- 如何在变化的时代中,抓住新时代的红利让自己跟着趋势赚钱
- Qt中采用多线程实现Socket编程
- 组织和遍历TreeView里面的数据
- ubuntu20.04安装无线网卡驱动
- 冰冻三尺非一日之寒,坚持,坚持,再坚持!
- 如何在 SubSystem for Android 上安装应用?
- 直播电商的运营逻辑,是否可以复制?
- 网络工程师必备学习内容!深度理解OSPF——OSPF是什么?为什么要用OSPF?
- 搜索引擎技术 —— 检索模型
- 萤石开放平台二次开发——摄像头取流至抖音直播平台
热门文章
- 微信小程序 个人收支理财记账本小程序Android hbuilderx App毕业设计
- web项目访问跳转的时候跳转页面空白 页面空白 控制台也不报错
- PL/SQL破解方法(不需要注册码)
- 2022-2028年全球与中国短波红外(SWIR)行业深度分析
- mysql stop failed_Mysql报错:Failed to stop mysqld.service: Unit mysqld.service not loaded.
- 智能网 联汽车信息安全发展趋势
- 内网渗透之CFS三层靶场渗透
- 思维方式-《六顶思考帽》书中的精髓:通过在同一时间只使用一顶思考帽的方法,可以解决思维混乱等问题,从而提升思考效率。
- 使用electron-buil将vue打包成exe并生成安装包
- 【题解】A1004 求三个数的平均数