【信号处理】数字信号处理Matlab设计附GUI界面和报告

1 简介​

信号处理是现代信息处理的基本内容,数字信号的处理更是重中之重。数字信号处理的研究内容主要是语音信号和图像信号,而研究语音信号对于现代语音通信有着积极的意义。研究语音信号又分为时域和频域两个方面。

(1)语音信号的时域分析处理:一类是进行语音信号分析,另一类是生成和变换各种调制信号,对信号平均累加器的动态范围进行压缩扩张,用门限方法进行噪声的抑制等等。前一类是属于时域中信号平均累加器的线性处理,主要通过信号的加减、时移、倍乘、卷积、求相关函数等来实现。而后一类,则属于非线性的变换和处理。

(2)语音信号的频谱分析处理:信号的时域频谱分析通常是要结合在一起进行的。

在数字设计系统中,任何信号处理器件都可以看成是一个滤波器,滤波器设计是数字信号处理的重要内容。滤波器就是在对信号进行分析的基础上,设计适当的系统,提取有用的信号,抑制噪声信号干扰。滤波器的设计通常是在频率域进行的。

本设计是用MATLAB仿真软件设计滤波器对受干扰的语音信号进行滤波处理,并对各部分进行频谱分析。

1.语音信号的采集

熟悉并掌握MATLAB中有关声音(wave)录制、播放、存储和读取的函数,在MATLAB环境中,使用声音相关函数录制3秒左右自己的声音。(考虑如何解决一个实际问题:录制刚开始时,常会出现实际发出声音落后录制动作半拍的现象,如何排除对这些无效点的采样?)

2.语音信号的频谱分析

要求首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,从而加深对频谱特性的理解。

3.设计数字滤波器并画出其频率响应

给出各滤波器的性能指标:

(1)低通滤波器性能指标:fb=1000 Hz,fc=1200 Hz,As=100dB,Ap=1dB。

(2)高通滤波器性能指标:fc=4800 Hz,fb=5000 Hz As=100dB,Ap=1dB。

(3)带通滤波器性能指标:fp1=1200 Hz,fp2=3000 Hz,fsc1=1000 Hz,fsc2=3200Hz,As=100dB,Ap=1dB。

要求用窗函数法和双线性变换法设计上面要求的3种滤波器。在Matlab中,使用函数butter,cheby1等函数设计IIR滤波器;利用Matlab中的函数freqz画出各滤波器的频率响应。

4.用滤波器对信号进行滤波

要求用自己设计的各种滤波器分别对采集的信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。

5.比较滤波前后语音信号的波形及频谱

要求在一个窗口同时画出滤波前后的波形及频谱。

6.回放语音信号

在Matlab中,使用相关声音函数对声音进行回放。辨别滤波前后的声音有何变化。

7.男女声语音信号频谱特点分析

换一个与你性别相异的人录制同样一段语音内容,分析两段内容相同的语音信号频谱之间有什么特点。

8. 背景噪声滤除

再录制一段同样长时间的背景噪声(频谱能量集中在某个小范围内)叠加到你的语音信号中,分析叠加前后信号频谱的变化,设计一个合适的滤波器,能够把该噪声滤除。

9.设计系统界面(用MATLAB中GUIDE工具,要求自学)

为了使编制的程序操作方便,要求有能力的同学,设计处理系统的用户界面。在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数,显示滤波器的频率响应,选择信号等。

2 部分代码

function varargout = cover1(varargin)% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name',       mfilename, ...    'gui_Singleton',  gui_Singleton, ...    'gui_OpeningFcn', @cover1_OpeningFcn, ...    'gui_OutputFcn',  @cover1_OutputFcn, ...    'gui_LayoutFcn',  [] , ...    'gui_Callback',   []);if nargin && ischar(varargin{1})    gui_State.gui_Callback = str2func(varargin{1});endif nargout    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else    gui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDITfunction cover1_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;ha=axes('units','normalized','position',[0 0 1 1]);uistack(ha,'down');II=imread('cover1.jpg');image(II)colormap grayset(ha,'handlevisibility','off','visible','off');hb = axes('unit','normalized','position',[0.38 0.95 0.365 0.051]);strCell = {'语音信号的处理与滤波'};%% 逐列显示文本text('string',strCell,'FontSize', 18, 'FontWeight', 'bold');set(hb,'handlevisibility','off','visible','off');hc = axes('unit','normalized','position',[0.01 0.56 0.061 0.03]);strCell = {'声音选择:'};%% 逐列显示文本text('string',strCell,'FontSize', 14, 'FontWeight', 'bold');set(hc,'handlevisibility','off','visible','off');hd = axes('unit','normalized','position',[0.258 0.822 0.094 0.041]);strCell = {'滤波器设置:'};%% 逐列显示文本text('string',strCell,'FontSize', 14, 'FontWeight', 'bold');set(hd,'handlevisibility','off','visible','off');he = axes('unit','normalized','position',[0.258 0.738 0.074 0.037]);strCell = {'设计方法:'};%% 逐列显示文本text('string',strCell,'FontSize', 8);set(he,'handlevisibility','off','visible','off');hf = axes('unit','normalized','position',[0.258 0.57 0.105 0.03]);strCell = {'请输入滤波器参数:'};%% 逐列显示文本text('string',strCell,'FontSize', 8);set(hf,'handlevisibility','off','visible','off');                end            end        end            endendfunction filter_Callback(hObject, eventdata, handles)global varvar = get(handles.filter,'value');switch var    case 1        set(handles.lowpass,'visible','off');        set(handles.lowstop,'visible','off');        set(handles.lowpasstarget,'visible','off');        set(handles.lowstoptarget,'visible','off');                set(handles.highpass,'visible','off');        set(handles.highstop,'visible','off');        set(handles.highpasstarget,'visible','off');        set(handles.highstoptarget,'visible','off');                set(handles.bandfilterstop1,'visible','off');        set(handles.bandfilterpass1,'visible','off');        set(handles.bandfilterpass2,'visible','off');        set(handles.bandfilterstop2,'visible','off');        set(handles.bandfilterpasstarget,'visible','off');        set(handles.bandfilterstoptarget,'visible','off');                axes(handles.FPRes1);        plot(0,0);        axes(handles.FPRes2);        plot(0,0);    case 2        set(handles.lowpass,'visible','on');        set(handles.lowstop,'visible','on');        set(handles.lowpasstarget,'visible','on');        set(handles.lowstoptarget,'visible','on');                set(handles.highpass,'visible','off'); 提示');     l(get(handles.bandfilterstop2,'                                bandfilterpasstarget = eval(get(handles.bandfilterpasstarget,'String'));                                bandfilterstoptarget = eval(get(handles.bandfilterstoptarget,'String'));                                wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);                                ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000);                                Rp = bandfilterpasstarget;                                As = bandfilterstoptarget;                                Fs=8000;T=1/Fs;  %转换为模拟滤 波器的技术指标                                Omgp1=(2/T)*tan(wp1/2);Omgp2=(2/T)*tan(wp2/2);                                Omgp=[Omgp1,Omgp2]; Omgs1=(2/T)*tan(ws1/2);                                Omgs2=(2/T)*tan(ws2/2); Omgs=[Omgs1,Omgs2];                                bw=Omgp2-Omgp1;w0=sqrt(Omgp1*Omgp2);%模拟通带带宽和中心频率                                [n,Omgn]=cheb1ord(Omgp,Omgs,Rp,As,'s'); %计算阶数n和截止频率                                [z0,p0,k0]=cheb1ap(n,Rp);  % 设计归一化的模拟滤波器原型                                ba1=k0*real(poly(z0)); %求原型 滤波器的系数b                                aa1=real(poly(p0));  %求原型滤 波器的系数a                                [ba,aa]=lp2bp(ba1,aa1,w0,bw);%变换为模拟带通滤波器                                [bd,ad]=bilinear(ba,aa,Fs);                                voiceandbackground = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav');                                voiceandbackgroundfft = fft(voiceandbackgroundfft);                                f = filter(bd,ad,voiceandbackground);                                f1 = fft(f);                                figure(11);                                set(figure(11),'Menu','none');                                set(figure(11),'NumberTitle','off','Name','滤波后的信号的频谱');                                set(figure(11),'Color','w');                                subplot(2,2,1);plot(voiceandbackground);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('背景噪声滤波前的波形');                                grid;                                subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('背景噪声滤波前的相对幅度谱');                                grid;                                subplot(2,2,3);plot(f1);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('背景噪声滤波后的波形');                                grid;                                subplot(2,2,4);plot(20*log10(abs(f1)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('背景噪声滤波后的相对幅度谱');                                grid;                            end                        end                        if(var == 4)                            if(isempty(str2num(get(handles.highpass,'String'))) || isempty(str2num(get(handles.highstop,'String'))) || ...                                    isempty(str2num(get(handles.highpasstarget,'String'))) || isempty(str2num(get(handles.highstoptarget,'String'))))                                errordlg('请正确输入参数','提示');                            else                                highpass = eval(get(handles.highpass,'String'));                                highstop = eval(get(handles.highstop,'String'));                                highpasstarget = eval(get(handles.highpasstarget,'String'));                                highstoptarget = eval(get(handles.highstoptarget,'String'));                                wp = 2*pi*highpass*1000*(1/12000);                                ws = 2*pi*highstop*1000*(1/12000);                                Rp =  highpasstarget;                                As =  highstoptarget;                                                                Fs=12000;T=1/Fs; %fs为采样频率, fp为中心频率                                Omgp=(2/T)*tan(wp/2); %原型通 带频率的预修正                                Omgs=(2/T)*tan(ws/2); %原型阻 带频率的预修正                                [n,Omgc]=ellipord(Omgp,Omgs,Rp,As,'s'); %计算阶数n和截止频率                                [z0,p0,k0]=ellipap(n,Rp,As); %设计归一化的椭圆模拟滤波器原型                                ba=k0*real(poly(z0)); %求原型 滤波器的系数 b                                aa=real(poly(p0));  %求原型滤 波器的系数 a                                [ba1,aa1]=lp2hp(ba,aa,Omgc); %变换为模拟高通滤波器                                [bd,ad]=bilinear(ba1,aa1,Fs);  %求数字系统的频率特性%求滤波器的分子及分母的系数矩阵                                                                voiceandbackground = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav');                                voiceandbackgroundfft = fft(voiceandbackground);                                f = filter(bd,ad,voiceandbackground);                                f1 = fft(f);                                figure(12);                                set(figure(12),'Menu','none');                                set(figure(12),'NumberTitle','off','Name','滤波后的信号的频谱');                                set(figure(12),'Color','w');                                subplot(2,2,1);plot(voiceandbackground);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('背景噪声滤波前的波形');                                grid;                                subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('背景噪声滤波前的相对幅度谱');                                grid;                                subplot(2,2,3);plot(f1);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('背景噪声滤波后的波形');                                grid;                                subplot(2,2,4);plot(20*log10(abs(f1)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('背景噪声滤波后的相对幅度谱');                                grid;                            end                        end                        flagvoice =0;                end            end        end        if(Fvar == 3)            if(var ~= 2 && var ~= 3 && var ~= 4)                errordlg('请选择滤波器类型','提示');            else                switch flagvoice                    case 1                        if(var == 2)                            if(isempty(str2num(get(handles.lowpass,'String'))) || isempty(str2num(get(handles.lowstop,'String'))) || ...                                    isempty(str2num(get(handles.lowpasstarget,'String'))) || isempty(str2num(get(handles.lowstoptarget,'String'))))                                errordlg('请正确输入参数','提示');                            else                                lowpass = eval(get(handles.lowpass,'String'));                                lowstop = eval(get(handles.lowstop,'String'));                                lowpasstarget = eval(get(handles.lowpasstarget,'String'));                                lowstoptarget = eval(get(handles.lowstoptarget,'String'));                                wp = 2*pi*lowpass*1000*(1/3000);                                ws = 2*pi*lowstop*1000*(1/3000);                                Rp = lowpasstarget;                                As = lowstoptarget;                                deltaw=ws-wp;          %计算过渡带宽度                                N0=ceil(6.6*pi/deltaw); %按汉宁窗计算滤波器长度N0                                N=N0+mod(N0+1,2) ;       %为实现FIR类型I偶对称滤波器,应确保N为奇数                                wc=(ws+wp)/2;           %截止频率取通阻带频率的平均值                                [bd,ad]=fir1(N,wc/pi,hanning(N+1));                                 boyvoice = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy',[3000,18000]);                                boyvoicefft = fft(boyvoice);                                f = filter(bd,ad,boyvoice);                                f1 = fft(f);                                figure(1);                                set(figure(1),'Menu','none');                                set(figure(1),'NumberTitle','off','Name','滤波后的信号的频谱');                                set(figure(1),'Color','w');                                subplot(2,2,1);plot(boyvoice);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('男生滤波前的波形');                                grid;                                subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('男生滤波前的相对幅度谱');                                grid;                                subplot(2,2,3);plot(f1);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('男生滤波后的波形');                                grid;                                subplot(2,2,4);plot(20*log10(abs(f1)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('男生滤波后的相对幅度谱');                                grid;                            end                        end                        if(var == 3)                                                        if(isempty(str2num(get(handles.bandfilterstop1,'String'))) || isempty(str2num(get(handles.bandfilterpass1,'String'))) || ...                                    isempty(str2num(get(handles.bandfilterpass2,'String'))) || isempty(str2num(get(handles.bandfilterstop2,'String'))) || ...                                    isempty(str2num(get(handles.bandfilterpasstarget,'String'))) || isempty(str2num(get(handles.bandfilterstoptarget,'String'))))                                errordlg('请正确输入参数','提示');                            else                                bandfilterstop1 = eval(get(handles.bandfilterstop1,'String'));                                bandfilterpass1 = eval(get(handles.bandfilterpass1,'String'));                                bandfilterpass2 = eval(get(handles.bandfilterpass2,'String'));                                bandfilterstop2 = eval(get(handles.bandfilterstop2,'String'));                                bandfilterpasstarget = eval(get(handles.bandfilterpasstarget,'String'));                                bandfilterstoptarget = eval(get(handles.bandfilterstoptarget,'String'));                                wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);                                ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000);                                 Rp = bandfilterpasstarget;                                As = bandfilterstoptarget;                                deltaw = wp1-ws1;                                N0 = ceil(11*pi/deltaw);                                N = N0+mod(N0+1,2);                                wc1 = (ws1+wp1)/2;wc2 = (ws2+wp2)/2;                                wc = [wc1 wc2];                                [bd,ad]=fir1(N,wc/pi,hanning(N+1));                                boyvoice = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy',[3000,18000]);                                boyvoicefft = fft(boyvoice);                                f = filter(bd,ad,boyvoice);                                f1 = fft(f);                                figure(2);                                set(figure(2),'Menu','none');                                set(figure(2),'NumberTitle','off','Name','滤波后的信号的频谱');                                set(figure(2),'Color','w');                                subplot(2,2,1);plot(boyvoice);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('男生滤波前的波形');                                grid;                                subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('男生滤波前的相对幅度谱');                                grid;                                subplot(2,2,3);plot(f1);              %画出滤波后的时域图                                xlabel('时间'); ylabel('幅值');                                title('男生滤波后的波形');                                grid;                                subplot(2,2,4);plot(20*log10(abs(f1)));                                xlabel('频率'); ylabel('幅值');     %加X轴说明 %加Y轴说明                                title('男生滤波后的相对幅度谱');                                grid;                            end                        end                        if(var == 4)                            if(isempty(str2num(get(handles.highpass,'String'))) || isempty(str2num(get(handles.highstop,'String'))) || ...                                    isempty(str2num(get(handles.highpasstarget,'String'))) || isempty(str2num(get(handles.hi

3 仿真结果

【信号处理】数字信号处理Matlab设计附GUI界面和报告_第1张图片

【信号处理】数字信号处理Matlab设计附GUI界面和报告_第2张图片

【信号处理】数字信号处理Matlab设计附GUI界面和报告_第3张图片

【信号处理】数字信号处理Matlab设计附GUI界面和报告_第4张图片

【信号处理】数字信号处理Matlab设计附GUI界面和报告_第5张图片

4 参考文献​

[1] 王一世,数字信号处理,北京理工大学出版社.

[2] 于俊凤,语音信号的识别和转换研究,学位论文,成都理工大学.

[3] 王正林,刘明.精通MATLAB 7[M].北京:电子工业出版社,2006.7

[4] 李国勇.计算机仿真技术与CAD—基于MATLAB的控制系统 电子工业出版社

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

你可能感兴趣的:(信号处理,matlab,语音识别,开发语言)