基于MATLAB的语音信号频谱分析及滤波

Tianyi_Li 发表于 2021/12/05 21:13:07 2021/12/05
【摘要】 题目:录制一段语音,在MATLAB平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。示例代码:[y,fs,bite]=wavread('1.wav');sound(y)audiorecorder(2*fs,fs);fft(y);Y=fft(y);fp=1000;fr=1200;as=40;ap=1;[N,Wn]=BUTTORD(2*fp/fs,2*fr/fs,ap,a...

题目:录制一段语音,在MATLAB平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。

示例代码:

[y,fs,bite]=wavread('1.wav');
sound(y)
audiorecorder(2*fs,fs);
fft(y);
Y=fft(y);
fp=1000;
fr=1200;as=40;ap=1;
[N,Wn]=BUTTORD(2*fp/fs,2*fr/fs,ap,as);
[B,A]=BUTTER(N,Wn);

解析:

1. 语音信号的频谱分析

MATLAB平台下,对语音号进行快速傅里叶变换,得到信号的幅频特性、对数幅度谱。要求与语音信号的时域波形图画在一个窗口。

clear all;
[I,Fs,bits]=wavread('3.wav');
sound(I);
Y=fft(I);
mag=abs(Y);
phase=angle(Y);
phase=phase*180/pi;
dB=20*log10(abs(Y)+eps);
t=(0:length(I)-1)/Fs;
subplot(2,2,1);plot(t,I);
title('波形图');xlabel('时间(s)');ylabel('幅度');
f=(1:length(Y))*Fs/length(Y);
subplot(2,2,2);plot(f,mag);
title('幅度谱');xlabel('频率(Hz)');ylabel('频谱幅度');
subplot(2,2,3);plot(f,phase);
title('相位谱');xlabel('频率(Hz)');ylabel('频谱相位');
subplot(2,2,4);plot(f,dB);
title('对数幅度谱');xlabel('频率(Hz)');ylabel('频谱幅度(dB)');

我们可以得到

2. 对语音信号进行加噪、去噪

给语音信号加入噪声,自己设计滤波器对带噪语音信号进行滤波,比较滤波前后语音信号的波形及频谱,并在一个窗口同时画出滤波前后的波形及频谱,分析结果。

close all;clear;clc;
fn=1500;
T=1/fn;
fp1=400;
fs1=450;
Ap=1;
As=40;
wp=2*pi*fp1/fn;
ws=2*pi*fs1/fn;
C=2/T;
Wp=C*tan(wp/2);
Ws=C*tan(ws/2);
[N,Wn]=buttord(Wp,Ws,Ap,As,'s');
[z,p,k]=buttap(N);
[B,A]=zp2tf(z,p,k);
[b,a]=lp2lp(B,A,Wn);
[b_L,a_L]=bilinear(b,a,fn);
fn=12000;
fp=5300;fs=5000;Ap=1;As=40;
fpp=2*fp/fn;
fss=2*fs/fn;
[N,wn]=buttord(fpp,fss,Ap,As);
[b,a]=butter(N,wn,'high');
[Voi,fs]=audioread('5.wav');
X=length(Voi);
figure(1);
subplot(2,1,1);plot(Voi);
xlabel('时间(ms)');
ylabel('幅值');
title('原始语音时域图');
V_f=abs(fft(Voi));
k=0:X/2-1;
subplot(2,1,2);plot(V_f);
xlabel('频率');
ylabel('幅值');
title('原始语音做FFT变换后频谱图');
Fn=1500;T=1/Fn;
t=0:T:(X-1)*T;
xt=0.1*(sin(3768*t)+sin(187.5*t));
Voi_n=Voi+xt';
sound(Voi_n,fs);
Voi_nf=abs(fft(Voi_n));
figure(2);
subplot(3,1,1);
plot(Voi_nf);
xlabel('频率');
ylabel('幅值');
title('加入600Hz高频、30Hz低频噪声的语音频谱');
W=filter(b_L,a_L,Voi_n);
WF=abs(fft(W));
subplot(3,1,2)
plot(WF);
xlabel('频率');
ylabel('幅值');
title('滤除高频噪声后的频谱');
 
S=filter(b,a,W);
SF=abs(fft(S));
subplot(3,1,3);
plot(SF);
xlabel('频率');
ylabel('幅值');
title('再滤除低频噪声后的频谱');

3. 回放语音信号

MATLAB语言中函数sound可以对声音进行回放。其调用格式:

sound(x,fs,bits)

分析:从播放滤波前和滤波后的声音效果来看,滤波后的语音信号听起来更加柔和。猜测是通过一个低通滤波器,滤除了高频杂音和降低了语音本身的能量。同时看到低频噪声和高频噪声均被滤除。同时原始语音信号本身也被衰减了,但是不影响听起来的效果。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。