
数字信号处理(Digital Signal Processing)技术,从20世纪60年代以来,随着计算机科学和信息科学、集成芯片制造工艺的飞速发展,数字处理技术应运而生并得以快速发展。 语言是人们进行信息沟通的主要方式之一,它具有直接、自然、方便等优点。语音则是语言的物理层表达方式。语音处理主要是对语音进行机器处理,以达到传输、自动识别、机器理解等目的。本文首先对语音信号处理进行了概述,其中包括各种处理技术、发展及应用。接下来主要介绍了语音识别方面的知识。根据语音识别系统的基本构成模型,介绍了预处理、端点检测到模板匹配各个部分所涉及到的语音数字信号处理原理和方法。重点研究了孤立词识别系统的原理、构成及各部分的实现算法。
论文中首先对语音信号的基本处理问题进行了分析和对比,然后在自己设计的基于TMS320VC5402的DSP实际系统上,进行了语音处理过程的滤波、采样、傅立叶变换和谱包络提取的算法实现研究,讨论了在算法的DSP实现方法,分析了运行实验结果。在此基础上,对GSM系统中的编码、回声抵消、说话人识别和交通车辆内部的噪声抵消应用进行了研究。最后对DSP实现语音信号处理的存在的问题和发展前景进行了展望。
第一章绪论
1.1 简析数字信号
数字信号处理(Digital Signal Processing,简称DSP)是一门涉及多门学科并广泛应用于很多科学与工程领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,有力地推动和促进了DSP技术的发展进程。在过去的二十多年时间里,DSP技术已经在通信等领域得到了极为广泛的应用。步入2l世纪以后,信息社会已经进入了数字化时代,DSP技术已成为数字化社会最重要的技术之一。DSP可以代表数字信号处理(DigJtal Signal Processing),也可以代表数字信号处理器(Digital Signal Processor),其实两者是不可分割的。前者是理论与计算方法的技术,后者是实现这些技术的通用或专用可编程微处理器:苍:片。随着DSP芯片的快速发展,应用越来越广泛,DSP这一英文缩写己被大家公认为数字信号处理器的代名词。
1.2 课程设计的目标
DSP作为专用的微处理器,它主要的目标,尤其是早期诞生的时候,主要是用于数字信号处理,内部结构一丌始采用了和普通的MCU不太一样的哈佛结构,主要特点就是分离数据流和指令流,并且在内部使用乘法累加器的运算内核和流水线结构。在MCU做乘法运算,需要数十个指令周期的时候,DSP一开始就拥有使用单指令的乘法运算能力。所以自从一出现,就被一些运算密集型的嵌入式或者脱机应用所关注。经过这么多年的发展,DSP的内部结构发生了很多的变化llJ,比如说与通用处理器的结合、并行化和专业化。与通用处理器的结合,就是在DSP芯片早面,用DSP的内核做运算密集型的数字信号处理的运算,在芯片内同时有通用的处理器内核做管理运算,这样形成的新的DSP产品,不仅有强的运算能力,还有好的事务处理能力。Dsp的应用现在已经很广泛了,像汽车、嵌入式的通信系统和安全加密,很多的安全加密产品,实际上加密算法是不占用计算机资源,是用DSP做的一个板子插到计算机里进行加密运算。随着DSP技术的不断发展,DSP处理器的性能也在不断提高。
1.3课程设计的内容及要求
课程设计内容:
根据设计要求分析系统功能,掌握设计中所需理论(采样频率、采样位数的概念,采样定理; 时域信号的FFT分析;数字滤波器设计原理和方法,各种不同类型滤波器的性能比较),阐明设计原理。集语音信号,并对其进行FFT频谱分析,画出信号的时域波形图和频谱图。 对所采集的语音信号加入干扰噪声,对语音信号进行回放,感觉加噪前后声音的变化,分析原因,得出结论。并对其进行FFT频谱分析,比较加噪前后语音信号的波形及频谱,对所得结果进行分析,阐明原因,得出结论。根据待处理信号特点,设计合适数字滤波器,绘制所设计滤波器的幅频和相频特性。用所设计的滤波器对含噪语音信号进行滤波。对滤波后的语音信号进行FFT频谱分析。画出处理过程中所得各种波形及频谱图。对语音信号进行回放,感觉滤波前后声音的变化。比较滤波前后语音信号的波形及频谱,对所得结果和滤波器性能进行频谱分析,阐明原因,得出结论。设计处理系统的用户界面,在所设计的系统界面上可以选择滤波器的参数,显示滤波器的频率响应,选择信号等。
课程设计要求:
1.本次课程设计要求利用MATLAB对语音信号进行数字信号处理和分析,要求学生采集语音信号后,在MATLAB软件平台进行频谱分析;并对所采集的语音信号加入干扰噪声,对加入噪声的信号进行频谱分析,设计合适的滤波器滤除噪声,恢复原信号。
2.基本教学要求:每组一台电脑(附话筒和耳机), 电脑安装MATLAB7.1版本以上软件。
第二章
语音信号处理理论基础
2.1简述语音信号
语音信号处理是研究用数字信号处理技术对语音信号进行处理的一门学科,它是一门新兴的学科,同时又是综合性的多学科领域和涉及面广的交叉学科。语音信号处理是许多信息领域应用的核心技术之一,是目前发展速度最快的信息科学技术领域中的一个。
2.2基础知识概述
在研究分析各种语音信号处理技术集应用之前,必须了解有关语音信号的一些基本特性。为了对语音信号进行数字处理,需要建立一个能够精确描述语音产生过程和语音全部特征的数字模型,即根据语音的长生过程建立一个又实用又便于分析的语音信号模型。发音语音学只要研究语音产生机理,借助仪器观察发音器官,以确定发音部位和发音方法。声音是一种波,能被人耳听到,它的振动频率在20~20000hz之间。自然界中包含各种各样的声音,如风声、雷声、雨声等。
根据语音信号的产生模型,可以将其豕一个线性非时变系统的输出表示,即看做是声门激励信号和声道冲激响应的卷积。在语音信号数字处理所涉及的各个领域中,根据语音信号求解声门激励和声道响应具有非常重要的意义。
同态称为同态滤波,它实现了将卷积关系变换为求和关系的分享处理。众所周知,为了分离加性组合信号,常用采用线性滤波方法。而为了分离非加性组合信号,常采用同态滤波技术。同态滤波是一咱非线性滤波,但它服从广义叠加原理。
加性信号可以用线性系统来处理,这种系统满足叠加性。但是许多信号,其组成各分量不是按加法原则组合起来的。如语音信号、图像信号、地震信号、通信中的衰落信号、调制信号都不是加性信号,而是乘积性信号或卷积性信号。此时不能用线性系统,而必须用满足其相应组合原则的非线性系统来处理。而同态信号处理就是非线性问题转化为线性问题来处理。按被处理的信号来分类,大体分为乘积同态处理和卷积同态处理和卷积同态处理两种。
第三章 系统方案论证
3.1 设计方案分析
信号的傅立叶表示在信号的分析与处理中起着重要的作用。因为对于线性系统来说,可以很方便地确定其对正弦或复指数和的响应,所以傅立叶分析方法能完善地解决许多信号分析和处理问题。另外,傅立叶表示使信号的某些特性变得更明显,因此,它能更深入地说明信号的各项红物理现象。
由于语音信号是随着时间变化的,通常认为,语音是一个受准周期脉冲或随机噪声源激励的线性系统的输出。输出频谱是声道系统频率响应与激励源频谱的乘积。声道系统的频率响应及激励源都是随时间变化的,因此一般标准的傅立叶表示虽然适用于周期及平稳随机信号的表示,但不能直接用于语音信号。由于语音信号可以认为在短时间内,近似不变,因而可以采用短时分析法。
本实验要求掌握傅里叶分析原理,会利用已学的知识,编写程序估计短时谱、倒谱,画出语谱图,并分析实验结果,在此基础上,借助频域分析方法所求得的参数分析语音信号的基音周期或共振峰。
3.2实验原理
1、短时傅立叶变换
由于语音信号是短时平稳的随机信号,某一语音信号帧的短时傅立叶变换的定义为:
(2.1)
其中w(n-m)是实窗口函数序列,n表示某一语音信号帧。令n-m=k',则得到
(2.2)
于是可以得到
(2.3)
假定
(4)
则可以得到
(5)
同样,不同的窗口函数,将得到不同的傅立叶变换式的结果。由上式可见,短时傅立叶变换有两个变量:n和ω,所以它既是时序n的离散函数,又是角频率ω的连续函数。与离散傅立叶变换逼近傅立叶变换一样,如令ω=2πk/N,则得离散的短时傅立叶吧如下:
(6)
2、语谱图
水平方向是时间轴,垂直方向是频率轴,图上的灰度条纹代表各个时刻的语音短时谱。语谱图反映了语音信号的动态频率特性,在语音分析中具有重要的实用价值。被成为可视语言。
语谱图的时间分辨率和频率分辨率是由窗函数的特性决定的。时间分辨率高,可以看出时间波形的每个周期及共振峰随时间的变化,但频率分辨率低,不足以分辨由于激励所形成的细微结构,称为宽带语谱图;而窄带语谱图正好与之相反。
宽带语谱图可以获得较高的时间分辨率,反映频谱的快速时变过程;窄带语谱图可以获得较高的频率分辨率,反映频谱的精细结构。两者相结合,可以提供带两与语音特性相关的信息。语谱图上因其不同的灰度,形成不同的纹路,称之为“声纹”。声纹因人而异,因此可以在司法、安全等场合得到应用。
3、复倒谱和倒谱
复倒谱是x(n)的Z变换取对数后的逆Z变换,其表达式如下:
(7)
倒谱c(n)定义为x(n)取Z变换后的幅度对数的逆Z变换,即
(8)
在时域上,语音产生模型实际上是一个激励信号与声道冲激响应的卷积。对于浊音,激励信号可以由周期脉冲序列表示;对于清音,激励信号可以由随机噪声序列表示。声道系统相当于参数缓慢变化的零极点线性滤波器。这样经过同态处理后,语音信号的复倒谱,激励信号的复倒谱,声道系统的复倒谱之间满足下面的关系:
(9)
由于倒谱对应于复倒谱的偶部,因此倒谱与复倒谱具有同样的特点,很容易知道语音信号的倒谱,激励信号的倒谱以及声道系统的倒谱之间满足下面关系:
(10)
浊音信号的倒谱中存在着峰值,它的出现位置等于该语音段的基音周期,而清音的倒谱中则不存在峰值。利用这个特点我们可以进行清浊音的判断,并且可以估计浊音的基音周期。
第四章 GUI设计实现
4.1原理图及程序
一 按钮放置
function varargout = jy01(varargin)
% JY01 M-file for jy01.fig
% JY01, by itself, creates a new JY01 or raises the existing
% singleton*.
%
% H = JY01 returns the handle to a new JY01 or the handle to
% the existing singleton*.
%
% JY01('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in JY01.M with the given input arguments.
%
% JY01('Property','Value',...) creates a new JY01 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before jy01_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to jy01_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help jy01
% Last Modified by GUIDE v2.5 01-Jul-2005 13:30:37
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @jy01_OpeningFcn, ...
'gui_OutputFcn', @jy01_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before jy01 is made visible.
图4-1 放置按钮
二 修改属性
function jy01_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to jy01 (see VARARGIN)
% Choose default command line output for jy01
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes jy01 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
图4-2 修改程序
三 运行程序
function varargout = jy01_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton2.
图4-3 运行程序
四 各按钮相应功能展示及程序
图4-4 运行结果组图
程序:
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)
[x]=wavread('01.wav');
sound(x);
subplot(4,1,1);
plot(x);
axis([1 length(x) -1 1]);
ylabel('Speech');
enhance=filter([1-0.9375],1,x);
FrameLen=240; FrameInc=80;
yframe=enframe(x,FrameLen,FrameInc);
amp1=sum(abs(yframe),2);
subplot(4,1,2);
plot(amp1);
axis([1 length(amp1) 0 max(amp1)]);
ylabel('Amp');
legend('amp1=¡Æ©¦x©¦');
amp2=sum(abs(yframe.*yframe),2);
subplot(4,1,3);
plot(amp2);
axis([1 length(amp2) 0 max(amp2)]);
ylabel('Energy');
legend('amp1=¡Æ©¦x*x©¦');
tmp1=enframe(x(1:end-1),FrameLen,FrameInc);
tmp2=enframe(x(2:end),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
zcr=sum(signs.*diffs,2);
subplot(4,1,4);
plot(zcr);
axis([1 length(zcr) 0 max(zcr)]);
ylabel('ZCR');
legend('zcr');
function f=enframe(x,win,inc)
nx=length(x(:));
nwin=length(win);
if (nwin == 1)
len = win;
else
len = nwin;
end
if (nargin < 3)
inc = len;
end
nf = fix((nx-len+inc)/inc);
f=zeros(nf,len);
indf= inc*(0:(nf-1)).';
inds = (1:len);
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));
if (nwin > 1)
w = win(:)';
f = f .* w(ones(nf,1),:);
end
% --- Executes on button press in pushbutton3.
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)
[our]=wavread('01.wav');
specgram_hw3p20(our,1024,512,10000);
specgram_hw3p20(our,512,256,10000);
function [spec] = specgram_hw3p20(x, winlgh, frmlgh, sampling_rate);
% specgram_hw3p20(x, winlgh, frmlgh, sampling_rate)
%
% function to compute a spectrogram
%
% x = input waveform
% winlgh = window length in samples
% frmlgh = frame length in samples
% sampling_rate = samples/sec
% PARAMETERS
%sampling_rate = 10000; % sampling rate
lfft = 1024; % FFT length
lfft2 = lfft/2;
%winlgh = 200; % (128) window length (in samples)
%frmlgh = 10; % frame interval (in samples)
noverlap = winlgh - frmlgh;
% x = x(1:4500);
x = 2.0*x/max(abs(x));
etime = length(x)/sampling_rate;
%---------------------------------------------------------------------------%
spec = abs(specgram(x, lfft, sampling_rate, winlgh, noverlap));
subplot(211);
plot((1:length(x))/sampling_rate,x)
xlabel('Time (s)');
title('SPEECH');
axis([0 etime -2.5 2.5]);
grid;
subplot(212)
imagesc(0:.010:etime, 0:1000:(sampling_rate/2), log10(abs(spec)));axis('xy')
xlabel('Time (ms)'),ylabel('Frequency (Hz)');
title('SPECTROGRAM');
--- 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)
clc;
clear;
tic,
[y,fs]=wavread('01.wav');
L=length(y);
fw=y.*hamming(L);
r=real(log(fft(fw,L)))
pfw=cceps(fw);
rpfw=rceps(fw);
z=rpfw(1:30);
p=pfw(31:L)
logz=real(exp(fft(z,L)));
logp=real(fft(p));
subplot(3,2,1);plot(y);title('Ôʼ²¨ÐÎ')
subplot(3,2,3);plot(pfw);title('¸´µ¹Æ×')
subplot(3,2,5);plot(rpfw);title('ʵµ¹Æ×')
subplot(3,2,6);plot(logz);title('µ¹Æ×ÓòÂ˲¨ºóµÄ¶ÔÊý·ù¶ÈÆ×')
subplot(3,2,4);plot(r);title('¶ÔÊý·ù¶ÈÆ×')
subplot(3,2,2);plot(fw);title('¼Óº£Ã÷´°ºóµÄ²¨ÐÎ')
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
speech1_10k=wavread('01.wav',[1024 1273]);%È¡250µãµÄÓïÒôÐźÅ
sw=speech1_10k.*hamming(250);%a¼ÓººÃ÷´°
Rsw=xcorr(sw');%a×ÔÏà¹Ø
t=0.1:0.1:25;subplot(1,2,1);plot(t,sw);xlabel('ms');title('¼Ó´°ºóʱÓò²¨ÐÎ');
subplot(1,2,2); t=0.1:0.1:length(Rsw)/10;plot(t,Rsw);xlabel('ms');title('¼Ó´°ºó×Թز¨ÐÎ');
Rsw4=[Rsw(250:253);Rsw(249:252);Rsw(248:251);Rsw(247:250)];%Éú³É4*4 ×ÔÏà¹ØÕó
Rsw6=[Rsw(250:255);Rsw(249:254);Rsw(248:253);Rsw(247:252);Rsw(246:251);Rsw(245:250)];%Éú³É6*6×ÔÏà¹ØÕó
rea4=inv(Rsw4)*Rsw(251:254)';%ÇóÔ¤²âϵÊý4
rea6=inv(Rsw6)*Rsw(251:256)';%ÇóÔ¤²âϵÊý6
A4=sqrt(Rsw(250)-Rsw(251:254)*rea4);%ÇóÔöÒæ
A6=sqrt(Rsw(250)-Rsw(251:256)*rea6);%ÇóÔöÒæ
w=pi/512:pi/512:pi;%Éú³ÉÊä³öƵÂÊ·¶Î§
j=sqrt(-1);
FW4=rea4'*[exp(-j*w);exp(-j*w*2);exp(-j*w*3);exp(-j*w*4)];%ÔÚÆµÂÊ·¶Î§ÇóÔ¤²âƵÏì
FW6=rea6'*[exp(-j*w);exp(-j*w*2);exp(-j*w*3);exp(-j*w*4);exp(-j*w*5);exp(-j*w*6)];%ÔÚÆµÂÊ·¶Î§ÇóÔ¤²âƵÏì
HW4=A4./(1-FW4);%ÓÉÔ¤²âƵÏìÇó
HW6=A6./(1-FW6);%ÓÉÔ¤²âƵÏìÇó
FW2=fft(sw,1024);%ÐźŸµÁ¢Ò¶±ä»»
FW3=FW2(1:512);
w=(1/1024:1/1024:0.5)*10000;
subplot(2,2,1);plot(w,log(abs(FW3)));xlabel('ƵÂÊhz');title('¼Ó´°ºóÐÅºÅÆµÆ×');
subplot(2,2,2);plot(w,log(abs(HW4)),'g');xlabel('ƵÂÊhz');title('4¼«µãÄ£ÐÍÆµÂÊÏìÓ¦');
subplot(2,2,3);plot(w,log(abs(HW6)),'r');xlabel('ƵÂÊhz');title('6¼«µãÄ£ÐÍÆµÂÊÏìÓ¦');
subplot(2,2,4);plot(w,log(abs(FW3)),w,log(abs(HW4)),w,log(abs(HW6)));xlabel('ƵÂÊhz');title('ÈýÕ߱ȽÏ');
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clear
Y=wavread('01.wav',[1 1800]);
x1=Y(271:510);x2=Y(271:510);x3=Y(271:510);
%×ÔÏà¹Ø·¨
r=zeros(1,240);
for k=1:240
for n=1:240-k
r(k)=r(k)+x1(n)*x1(n+k);
end
end
j=1:240;
subplot(2,2,2);plot(j,r);title('×ÔÏà¹Ø·¨´¦ÀíºóµÄ²¨ÐÎ')
subplot(2,2,1);plot(j,x1);title('Ôº¯Êý')
%Èýµçƽ·¨
for k1=1:1:240
if x2(k1)>0
x2(k1)=1;
else if x2(k1)==0
x2(k1)=0;
else if x2(k1)<0
x2(k1)=-1;
end
end
end
end
j=1:240;
subplot(2,2,3);plot(j,x2);title('Èýµçƽ·¨´¦ÀíºóµÄ²¨ÐÎ')
%ÖÐÐÄÏû²¨·¨
for k1=1:1:240
ma=abs(max(x3));
tc=0.6*ma;
if x3(k1)>tc
x3(k1)=x3(k1)-tc;
else if x3(k1)<-tc
x3(k1)=x3(k1)+tc;
else
x3(k1)=0;
end
end
end
j=1:240;
subplot(2,2,4);plot(j,x3);title('ÖÐÐÄÏû²¨·¨´¦ÀíºóµÄ²¨ÐÎ')
% --- 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 (see GUIDATA)
clear
clc
winsize=256; % ´°³¤
winsize=256; % ´°³¤
n=0.04; % ÔëÉùˮƽ
[speech,fs,nbits]=wavread('01.wav'); % ¶ÁÈëÊý¾Ý
size=length(speech);
numofwin=floor(size/winsize); % Ö¡Êý
%¼Ó´°
ham=hamming(winsize)'; %Generates Hamming Window
hamwin=zeros(1,size); %Vector for window gain
enhanced=zeros(1,size); %Vector for enhanced speech
%²úÉú´øÔëÐźÅ
x=speech'+ n*randn(1,size); %Contaminates signal with white noise
%ÔëÉù¹À¼Æ
noisy=n*randn(1,winsize); %Sample of noise
N = fft(noisy);
nmag= abs(N); %Estimated noise magnitude spectrum
for q=1:2*numofwin-1
frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2); %50 percent overlap
hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham; %Window gain
%¶Ô´øÔëÓïÒô½øÐÐDFT
y=fft(frame.*ham);
mag = abs(y); %Magnitude Spectrum
phase = angle(y); %Phase Spectrum
%·ù¶ÈÆ×¼õ
for i=1:winsize
if mag(i)-nmag(i)>0
clean(i)= mag(i)-nmag(i);
else;clean(i)=0;
end
end
%ÔÚÆµÓòÖÐÖØÐºϳÉÓïÒô
fff=exp(j*phase);
spectral=clean.*fff;
%IDFT²¢ÖصþÏà¼Ó
enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(spectral));
end
% ³ýÈ¥Hamming´°ÒýÆðµÄÔöÒæ
for i=1:size
if hamwin(i)==0
enhanced(i)=0;
else
enhanced(i)=enhanced(i)/hamwin(i);
end
end
SNR1 = 10*log10(var(speech')/var(noisy)); %¼ÓÔëÓïÒôÐÅÔë±È
SNR2 = 10*log10(var(speech')/var(enhanced-speech')); %ÔöÇ¿ÓïÒôÐÅÔë±È
wavwrite(x,fs,nbits,'noisy.wav'); %Êä³ö´øÔëÐźÅ
wavwrite(enhanced,fs,nbits,'enhanced.wav'); %Êä³öÔöÇ¿ÓïÒô
subplot(3,1,1);plot(speech'); %ÔʼÓïÒô²¨ÐÎ
title(['Original Voice (n=',num2str(n),')' ]);
specgram(speech'); %ÔʼÓïÒôÓïÆ×
title(['Original Voice (n=',num2str(n),')' ]);
subplot(3,1,2); plot(x);
title(['Noise Added (SNR=',num2str(SNR1),'dB)']);
specgram(x); %¼ÓÔëÓïÒôÓïÆ×
title(['Noise Added (SNR=',num2str(SNR1),'dB)']);
subplot(3,1,3);plot(enhanced);
title(['Improved Voice (SNR=',num2str(SNR2),'dB SNR=',num2str(SNR2-SNR1),'dB)']);
specgram(enhanced);
title(['Improved Voice (SNR=',num2str(SNR2),'dB SNR=',num2str(SNR2-SNR1),'dB)']); pause;
sound(speech);pause;
sound(x);pause;
sound(enhanced);
% --- 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)
%function [x1,x2] = vad(x)
%function [x1,x2] = vad(x)
[our]=wavread('01.wav');
specgram_hw3p20(our,1024,512,10000);
specgram_hw3p20(our,512,256,10000);
function [spec]=specgram_hw3p20(x, winlgh, frmlgh, sampling_rate);
% specgram_hw3p20(x, winlgh, frmlgh, sampling_rate)
%
% function to compute a spectrogram
%
% x = input waveform
% winlgh = window length in samples
% frmlgh = frame length in samples
% sampling_rate = samples/sec
% PARAMETERS
%sampling_rate = 10000; % sampling rate
lfft = 1024; % FFT length
lfft2 = lfft/2;
%winlgh = 200; % (128) window length (in samples)
%frmlgh = 10; % frame interval (in samples)
noverlap = winlgh - frmlgh;
% x = x(1:4500);
x = 2.0*x/max(abs(x));
etime = length(x)/sampling_rate;
%---------------------------------------------------------------------------%
spec = abs(specgram(x, lfft, sampling_rate, winlgh, noverlap));
subplot(211);
plot((1:length(x))/sampling_rate,x)
xlabel('Time (s)');
title('SPEECH');
axis([0 etime -2.5 2.5]);
grid;
subplot(212)
imagesc(0:.010:etime, 0:1000:(sampling_rate/2), log10(abs(spec)));axis('xy')
xlabel('Time (ms)'),ylabel('Frequency (Hz)');
title('SPECTROGRAM');
% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
第五章 总结与心得体会
这次课程设计提高了我的分析解决问题的能力,在设计中不时的出现许多不懂的问题,经过自己的分析和老师的指点最终得以解决。这样的机会不是很多,希望学校能够多多提供这样的机会。同时也非常感谢老是的知道和帮助。我想在未来的日子我们会学到更多的知识,能够更好的提高自己。
与此同时,我感谢我的老师对我的谆谆教诲和悉心指导。本文从选题、研究工作的展开到最后整个论文的完成,都是老师多次辅导的结果,处处渗透着老师大量的心血和宝贵的时间。还要感谢实验室的所有同学对我的帮助,祝愿大家学习进步、身体健康!向所有关心和帮助我的老师、同学和朋友致以诚挚的谢意。
参考文献
[1] 清源科技.TMS320C54x DSP应用程序设计教程[M].北京:机械工业出版社,2003.
[2] 尹勇,欧光军.DSP 集成开发环境CCS开发指南[M].北京:北京航空航天大学出版社,2003.
[3] 徐盛,胡剑凌.数字信号处理器开发与实践[M].上海:上海交通大学出版社,2003.
[4] 戴明桢,周建江.TMS320C54X DSP结构、原理及应用[M].北京:北京航空航天大学出版社,2001.
