我是靠谱客的博主 还单身饼干,最近开发中收集的这篇文章主要介绍MATLAB 语音信号处理之计算频谱、功率谱、滤波,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MATLAB 语音信号处理之显示频谱、滤波

    • 显示原始语音信号的特征频带(谱峰位置)
    • 设计低通滤波器对语音信号进行处理

对原始语音信号进行采用,然后提取频率、幅度信息,然后求得语音信号的功率谱并显示。使用 基于汉宁窗的窗函数法脉冲响应不变法双线性变换法设计了 三个低通滤波器对语音信号进行滤波并比较其滤波效果。

显示原始语音信号的特征频带(谱峰位置)

利用Windows自带的录音机录制了一个16s的语音文件,编写MATLAB程序对语音信号进行处理。语音信号是一种非平稳的时变信号,携带着很多信息。利用audioread函数对录音进行采样,将采样后的信号进行快速傅里叶变换,使其从时域信号转换为频域信号,并将原始语音信号的时域信号频域信号进行作图显示,完成对语音信号的频率、幅度等信息的提取。

[y,Fs] = audioread('a.m4a'); %样本数据 y 以及该数据的采样率 Fs  
Faudio=Fs;  
figure(1);  
plot(y,'b');  
title('原始语音的时域信号');  
xlabel('时间轴');  
ylabel('幅值');  
  
y=y(:,1); %取出其中一声道  
yFFT=fft(y);  
yDFT=abs(yFFT);  
yLen=length(y);  
k=0:yLen-1;  
Fk1=k.*Fs/yLen;  
figure(2)  
plot(Fk1,yDFT,'b');  
xlim([0 5000]);  
title('原始语音信号频谱')    
xlabel('f(Hz)');  
ylabel('幅度');   

然后求原始语音信号的特征频带,采用的是对每秒的声音信号求功率谱,即对语音信号进行傅里叶变换后,去其模的平方,然后对得到的结果进行绘图。

代码如下

for i=0:16  
	YPow=y(Fs*i+1:Fs*(i+1)+1);  
	YPowFft=fft(YPow,Fs);  
	YPowDFT=abs(YPowFft);  
    PowerY=YPowDFT.^2;     %功率谱  
	figure(i+3);  
	plot(PowerY);  
	xlabel('频率/Hz');  
	ylabel('功率');  
    title(['第',num2str(i+1),'秒的语音信号的功率谱'])  
	xlim([0 2600]);  
end  

设计低通滤波器对语音信号进行处理

使用基于汉宁窗的窗函数法脉冲响应不变法双线性变换法设计了三个低通滤波器,对三种滤波器的滤波效果进行对比分析。设计的低通滤波器的.通带临界频率为1600Hz,通带内最大衰减为3dB,阻带截止频率为1800Hz,阻带内衰减大于15dB。
对于使用汉宁窗的低通滤波器的设计,将低通滤波的截止频率关于π归一化,然后使用公式B=(2×π×200)/F_s 计算对应的数字带宽,由汉宁窗的过渡带宽为6.2π/N计算出所需h(n)的长度。
对于脉冲响应不变法设计低通滤波器的完整过程为:将数字滤波器的指标转化为模拟滤波器的指标,由模拟滤波器的指标设计模拟滤波器H(s),利用脉冲响应不变法将H(s)转化为H(z).变换过程如下。

脉冲响应不变法在MATLAB上通过函数impinvar实现。
双线性变换法设计低通滤波器的步骤如下:首先将数字滤波器的频率指标转换模拟滤波器的频率指标,然后由模拟滤波器的指标设计模拟滤波器H(s),利用双线性变换法,将H(s)转换为H(z).双线性变换法在MATLAB上通过函数bilinear实现。

滤波器设计

fpLow=1600; fsLow=1800;  
  
%窗函数法,使用汉宁窗  
wcLow=(fpLow+fsLow)/Fs;    %理想滤波器的截止频率,将截止频率关于pi归一化  
BLow=2*pi*(fsLow-fpLow)/Fs;  
NLowWin=ceil(6.2*pi/BLow);  %hanning窗的长度N  
wLow= hann(NLowWin);  
hnLowWin=fir1(NLowWin-1,wcLow,'low',wLow);  
[hLowWin,wLowWin]=freqz(hnLowWin,1);  
fLowWin=2*wLowWin*Fs/pi;  

%脉冲响应不变法  
[nLow,WnLow]=buttord(2*pi*fpLow,2*pi*fsLow,3,15,'s');  
[bLow1,aLow1]=butter(nLow,WnLow,'s');  
[bzLow1,azLow1]=impinvar(bLow1,aLow1,Fs); %映射为数字的  
[hLow1,wLow1]=freqz(bzLow1,azLow1);  
%双线性变换法
wpLow=(fpLow/Fs)*2*pi;  %临界频率  
wsLow=(fsLow/Fs)*2*pi;    
OmegaPLow2=2*Fs*tan(wpLow/2);   
OmegaSLow2=2*Fs*tan(wsLow/2);   
[nLow2,WnLow2]=buttord(OmegaPLow2,OmegaSLow2,3,15,'s');    
[bLow2,aLow2]=butter(nLow2,WnLow2,'s');    
[bzLow2,azLow2]=bilinear(bLow2,aLow2,Fs); %映射为数字的   
[hLow2,wLow2]=freqz(bzLow2,azLow2);  

然后使用设计的滤波器对语音信号进行滤波处理。
代码如下

YLowWin=filter(hLowWin,1,y);  
YALowWin=abs(fft(YLowWin));  
%sound(YLowWin,Fs);  
YLow1=filter(bzLow1,azLow1,y);  
YALow1=abs(fft(YLow1));  
%sound(YLow1,Fs);  
YLow2=filter(bzLow2,azLow2,y);  
YALow2=abs(fft(YLow2));  
%sound(YLow2,Fs);  

注:sound函数的功能为播放处理后的语音

滤波后语音信号如图
滤波后的语音信号

最后

以上就是还单身饼干为你收集整理的MATLAB 语音信号处理之计算频谱、功率谱、滤波的全部内容,希望文章能够帮你解决MATLAB 语音信号处理之计算频谱、功率谱、滤波所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部