【语音增强】基于matlab iir带阻滤波器语音增强【含Matlab源码 613期】

121 阅读4分钟

一、简介

语音增强是指当语音信号被各种各样的噪声干扰、甚至淹没后,从噪声背景中提取有用的语音信号,抑制、降低噪声干扰的技术。一句话,从含噪语音中提取尽可能纯净的原始语音。
实际语音遇到的干扰可以分以下几类:①周期性噪声,例如电气干扰,发动机旋转部分引起的干扰等,这类干扰表现为一些离散的窄频峰;②冲激噪声,例如-些电火花、放电产生的噪声干扰;③宽带噪声,这是指高斯噪声或白噪声一类的噪声,它们的特点是频带宽,几乎覆盖整个语音频带;④语音干扰,例如话筒中拾入其它人的说话,或者传输时遇到串音引起的语音。对付上述各种不同类型的噪声,增强技术亦是不一样的。
语音增强的一个主要目标是从带噪语音信号中提取尽可能纯净的原始语音。然而,由于干扰通常都是随机的,从带噪语音中提取完全纯净的语音几乎不可能。在这种情况下,语音增强的目的主要有两个:一是改进语音质量,消除背景噪音,使听者乐于接受,不感觉疲劳,这是一种主观度量;二是,这是一种客观度量。这两个目的往往不能兼得。目前有一些对低信噪比带噪语音进行语音增强的方法,可以显著地降低背景噪声,改进语音质量,但并不能提高语音的可懂度,甚至略有下降。
语音增强不但与语音信号数字处理理论有关,而且涉及到人的听觉感知和语音学范畴。再者,噪声的来源众多,因应用场合而异,它们的特性也各不相同。所以必须针对不同噪声,采用不同的语音增强对策。某些语音增强算法在实际应用中己经证明是有效的,它们大体上可分为四类:噪声对消法、谐波增强法、基于参数估计的语音再合成法和基于语音短时谱估计的增强算法。

二、源代码

%% P2_2_1 语音信号采样,画出时域和频域的图

[y,fs] = audioread('myname.wav');% y为采样数据;fs为采样频率
sound(y,fs);          % 播放语言信号myname
N = length(y);        % 信号的长度
t = (0:N-1)/fs;       % 时域范围
figure(1);subplot(211);plot(t,y); title('音频时域图');%音频信号时域图
xlabel('Time');ylabel('Amplitude');
Y = fft(y,N);           % FFT分析频谱
df = fs/length(Y);      % 计算谱线间隔
f = 0:df:(fs/2-df);     % 频谱范围,截取前半段(抽样频率高于最大频率的2倍)
Yf = abs(Y);            % 幅度响应
Yf = Yf(1:length(Yf)/2);% 由于幅度响应是偶函数,所以截取一半

% 画图
figure(1);
subplot(212);axis([0,fs/5,0,5000]);plot(f,Yf);title('音频频谱图');

%% P2_2_2 加入噪声之后的时域和频域图

y = y(:,1); y = y';
nt = randn(1,length(y));            % 生成高斯噪声
%设计BPF得到4KHZ到5KHZ的噪音
fp1 = 4000;fp2 = 5000;              % BPF指标
WP1 = 2*pi*fp1/fs;WP2 = 2*pi*fp2/fs;% 将模拟指标转换为数字指标
wn1 = [WP1 WP2];
b = fir1(34,wn1,'bandpass');
yn = filter(b,1,nt);   % 噪声的信号 
s = y+yn;              % 将带限噪音和原来的音频混合
%sound(s,fs);
S = fft(s,N);
Sf = abs(S);                % 幅度
DF = fs/length(S);          % 计算谱线间隔
f = 0:DF:(fs/2-DF);         % 频谱范围,截取前半段(抽样频率高于最大频率的2倍)
Sf = Sf(1:length(Sf)/2);    % 由于幅度响应是偶函数,所以截取一半

% 画图
figure(2);
subplot(211);plot(t,s); title('加入噪声的音频时域图');
xlabel('Time');ylabel('Amplitude');grid on;
subplot(212);axis([0,fs/5,0,10000]);plot(f,Sf);title('加入噪声的音频频谱图');
xlabel('Frequency');ylabel('Amplitude');grid on;


%% P2_2_3 设计滤波器,并滤波

%设计带阻滤波器滤除噪声
FP1 = 3500;FS1 = 3600;FP2 = 5600;FS2 = 5500;
rp2 = 1;rs2 = 40;
FP = [FP1 FP2];FS = [FS1 FS2];
wp = 2*pi*FP/fs;                    % 将模拟指标转换为数字指标
ws = 2*pi*FS/fs;                    % 用切比雪夫IIR滤波器
[n,wn] = cheb1ord(wp,ws,rp2,rs2);   % 滤波器的最小阶数为n,wn为系统频带
[bz,az] = cheby1(n,rp2,wp,'stop');
 
sound(yfilt,fs);                    % 播放滤波后的语音信号
Yfil = abs(fft(yfilt,N));
Yf = Yfil(1:length(Yfil)/2);

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a