1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Matlab数字信号处理的仿真系统(具有界面)

Matlab数字信号处理的仿真系统(具有界面)

时间:2021-05-01 11:40:43

相关推荐

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的方波endaxes(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 powerPn=sum(sum((I-In).^2)); %noise powersnr=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);endguidata(hObject,handles)

做dft变换到用到了自己写的DFT_h函数。

%用二重循环实现DFT:function [magXk,phaXk]=DFT_(xn) %define a functionN=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 DTFTend

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的功率谱Sxt = (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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。