语音信号的滤波与频谱分析

更新时间:2023-09-20 12:47:01 阅读量: 医药卫生 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

生物医学信号处理大作业

题目:语音信号的滤波与频谱分析

学生姓名 学院名称 精密仪器与光电子工程 专 业 学 号

一、实验目的

语音信号的滤波与频谱分析

录制自己的一段语音:“天津大学精密仪器与光电子工程学院生物医学工程X班XXX, College of precision instrument and opto-electronics engineering, biomedical engineering”,时间控制在15秒到30秒左右;利用wavread函数读入语言信号,记住采样频率。

二、实验过程

(1)求原始语音信号的特征频带:可以分别对一定时间间隔内,求功率谱(傅里叶变换结果取模的平方)并画出功率谱。

(2)根据语音信号频谱特点,设计FIR或IIR滤波器,分别画出滤波器幅频和相频特性曲线。说明滤波器特性参数。用设计的滤波器对信号滤波,画出滤波后时域波形。用sound函数回放语音信号。

(3)求出特征频段语音信号随时间变化的曲线(每隔0.05秒求一次功率谱,连接成曲线)。

(4)选做:语谱图:横轴为时间,纵轴为频率,灰度值大小表示功率谱值的大小。(提示,可以采用spectrogram函数)

(1)读入语音文件并画出其时域波形和频域波形,实现加窗fft并求出其功率谱。

clc

clear all; close all;

[x,Fs,bits]=wavread('C:\\Users\\刘冰\\Desktop\\数字信号处理\\liubing');

x0=x(:,1); %将采集来的语音信号转换为一个数组 sound(x0,Fs,bits); y=fft(x);

figure;plot(x,’b’);title('原始语音信号时域波形'); y1=fft(x0);

y1=fftshift(y1); d = Fs/length(x);

figure;plot([-Fs/2:d: Fs/2-d],abs(y1),’b’);title('原始语音信号的频域信号'); % 画出原始语音信号的频谱图

原始语音信号时域波形10.80.60.40.20-0.2-0.4-0.6-0.8-1012345678x 1095

原始语音信号的频域波形300025002000150010005000-2.5-2-1.5-1-0.500.511.522.5x 104

N=length(x);

w1 = window(@hann,N); w2 = window(@blackman,N); x1=x0.*w1; %对原始信号加汉宁窗处理 x2=x0.*w2; %对原始信号加布兰克曼窗处理 figure,plot(x1);title(加汉宁窗后的语音信号) %显示加窗后的时域语音信号 s=floor(length(x0)/Fs);

%计算原始语音信号的时间长度,这里得到的结果是18秒,因为floor是向下取整,所以信号的末尾一点会被去掉,但是因为最后一点没有声音信号,所以影响可以忽略。

%加汉宁窗后功率谱,加布兰克曼窗后又可以得到一组图,只需要将下列循环中的x1改为x2,这里就不再显示

%每两秒对语音信号求一次功率谱并显示

for i=1:1:s/2

f=x1((i-1)*Fs*2+1:i*Fs*2); %每两秒取出一段信号 l=length(f); q=fft(f,l);

E=abs(q).*abs(q); %傅里叶变换结果取模的平方

figure,plot(E(1:3000),'b');title(['第',num2str(i*2-1),'~',num2str(i*2),'秒语音功率谱']);

%因为语音信号主要集中在低频段,所以这里只需要显示低频段即可,取(1:3000)

end

加窗后的时域波形

0.80.60.40.20-0.2-0.4-0.6-0.8012345678x 1095

第1~2秒语音功率谱5000450040003500300025002000150010005000050010001500200025003000

5~6秒语音功率谱18x 104第16141210864200500100015002000250030007~8秒语音功率谱10x 105第9876543210050010001500200025003000第11~12秒语音功率谱12x 10510864200500100015002000250030004第15~16秒语音功率谱7x 106543210050010001500200025003000第3~4秒语音功率谱3.5x 10432.521.510.50050010001500200025003000

5第9~10秒语音功率谱7x 106543210050010001500200025003000

13~14秒语音功率谱6x 105第5432100500100015002000250030004第17~18秒语音功率谱2.5x 1021.510.50050010001500200025003000

频谱分析:人说话的频率基本集中在1200Hz以内的低频段,但我这里可以在高频段(2000Hz左右)可以观察到部分能量,这应该是在录音的时候电脑本身的噪音以及录音设备的误差造成

(2)根据功率谱线,大致可观察到语音信号在150~400和500~650之间有两个波峰,因此取这两个频宽作为我语音信号的特征频带,根据要求选择汉宁窗作为滤波器滤波。

1)汉宁窗滤波器的幅频特性显示

%汉宁窗 f1=150; %通带上下两个频率 f2=400; %带通滤波器的通带范围 w1=2*pi*f1/Fs; %归一化 w2=2*pi*f2/Fs; w=[w1,w2];

N=ceil(4*pi/(2*pi*200/Fs));%求出所需滤波器的阶数 Windows=HANNING(N);

b1=FIR1(N-1,w, Windows); %带通滤波器

figure;freqz(b1,1,512);title('汉宁窗带通(150~400)滤波器的频率响应'); %数字滤波器频率响应 f1=500;

f2=650; %带通滤波器的通带范围 w1=2*pi*f1/Fs; w2=2*pi*f2/Fs; w=[w1,w2]; N=ceil(4*pi/(2*pi*200/Fs)); Nw=N;

Windows=HANNING(N);

b2=FIR1(N-1,w, Windows);%带通滤波器

figure;freqz(b2,1,512);title('汉宁窗带通(500~~650)滤波器的频率响应');%数字滤波器频率响应

汉宁窗带通(150~400)滤波器的频率响应100Magnitude (dB)0-100-200-30000.10.20.30.40.50.60.70.8Normalized Frequency (?? rad/sample)0.911000Phase (degrees)0-1000-200000.10.20.30.40.50.60.70.8Normalized Frequency (?? rad/sample)0.91

汉宁窗带通(500~~650)滤波器的频率响应0Magnitude (dB)-100-200-30000.10.20.30.40.50.60.70.8Normalized Frequency (?? rad/sample)0.91500Phase (degrees)0-500-1000-150000.10.20.30.40.50.60.70.8Normalized Frequency (?? rad/sample)0.91

2)将原始语音信号分别通过两个频带,以下是滤波后的时域波形

band1=fftfilt(b1,x0);

sound(band1,Fs,bits); %滤波后听到的声音有了明显的变化

subplot(2,1,1);plot(band1);title('汉宁窗(150~400)滤波后的时域波形'); band2=fftfilt(b2,x0); sound(band2,Fs,bits);

subplot(2,1,2);plot(band2);title('汉宁窗(500~650)滤波后的时域波形');

汉宁窗(150~400)滤波后的时域波形210-1-2012345678x 10汉宁窗(500~650)滤波后的时域波形0.40.20-0.2-0.4012345678x 109595

(3)特征频段语音信号随时间变化的曲线,分别作出150~400和500~650特征频带的语音信号曲线

a=zeros(s/0.05,1);%这一步是为了求出所画信号曲线的长度,并定义空数组 for i=1:s/0.05

f=x0((i-1)*Fs*0.05+1:i*Fs*0.05);%每0.05秒取出一段数据 l=length(f); q=fft(f,l);

E=q.*conj(q)/l; %求出该段的功率 a(i)=mean(E(150~400)); %求平均 end

figure,plot(0:0.05:s-0.05,a);title('150~400Hz汉宁窗滤波后的功率谱曲线')

b=zeros(s/0.05,1); for i=1:s/0.05

f=x0((i-1)*Fs*0.05+1:i*Fs*0.05); l=length(f); q=fft(f,l);

E=q.*conj(q)/l;

b(i)=mean(E(500:650)); end

figure,plot(0:0.05:s-0.05,b);title('500~650Hz汉宁窗滤波后的功率谱曲线')

2.5x 10-3150~400Hz汉宁窗滤波后的功率谱曲线21.510.50024681012141618

98765432100x 10-5500~650Hz汉宁窗滤波后的功率谱曲线24681012141618

本文来源:https://www.bwwdw.com/article/x97h.html

Top