本次课程设计是采用MATLAB进行设计基于汉宁窗的FIR高通滤波器音频去噪,在设计过程中,首先录制一段不少于5秒的音频音乐,作为输入信号,并对录制的信号进行采样;其次使用MATLAB会出采样后的语音信号的时域波形和频谱图;然后在给原始的语音信号叠加上多频正弦噪声,并绘出叠加噪声前后的时域图及频谱图;之后利用MATLAB进行设计基于汉宁窗的FIR高通滤波器,并根据音频信号,给出滤波器的性能指标为:通带截止频率为300Hz,阻带截止频率为250Hz,阻带最小衰减为-44dB,采样率为44100Hz;最后对仿真结果进行分析,根据录音对比去噪效果,并对比滤波前后的信号时域频域图的波形变化,并给出滤波器特性曲线。最终,本课程设计出的滤波器性能指标和降噪效果都可以满足要求。
关键词: MATALB 汉宁窗 FIR高通滤波器 音频滤波
目 录
摘 要... II
1. 引言... 1
2. 设计内容及要求... 2
2.1 设计内容... 2
2.2 任务要求... 2
3. 设计原理... 2
4. 设计方案... 3
4.1 音频信号的采集与输入... 4
4.2 含噪信号的合成... 6
4.3 汉宁窗FIR高通滤波器的设计... 6
4.4 基于汉宁窗高通FIR滤波器的性能指标... 7
5. 结果及分析... 8
5.1 滤波器的实现... 8
5.2 滤波器滤波实现... 10
6. 总结... 11
7. 参考资料... 12
附录:程序源代码... 13
数字信号处理在现代通信、音频和图像处理等领域中得到了广泛的应用,而数字滤波器是其中的重要组成部分。数字滤波器是一种用于信号处理的数学模型,其目的是将输入信号经过滤波器后输出所需的信号。高通FIR滤波器是数字滤波器的一种重要类型,其特点是通过去除低频分量并保留高频分量,可以提高信号的质量和准确性,被广泛应用于语音和图像处理等领域。
在数字滤波器的设计中,窗函数是一种常用的工具。窗函数是一种用于限制滤波器响应范围的函数,常用于滤波器的设计中。汉宁窗是一种常用的窗函数之一,具有良好的副瓣抑制特性,可用于FIR滤波器设计中。
本文旨在研究和设计基于汉宁窗的高通FIR滤波器,以实现对低频分量的去除和高频分量的保留,提高信号的质量和准确性。该设计方法具有简单、有效、实用的特点,在实际应用中具有广泛的应用前景。在本文中,我们将介绍高通FIR滤波器的基本原理,详细阐述汉宁窗的特性及其在高通FIR滤波器设计中的应用,进而给出基于汉宁窗的高通FIR滤波器的设计方法和实现步骤,并通过实验验证设计的有效性和性能。最后,我们将讨论该设计方法的优缺点及其在实际应用中的适用性和局限性[1]。
选用给定音频信号,或自行录制一段音频 ,要求时长5~10秒。在音频信号中叠加单个或多个低频频率分量。
用汉宁窗函数法设计FIR高通滤波器,通带截止频率、阻带截止频率自行设定,以能够滤除叠加的低频分量为准。通带最大衰减、阻带最小衰减依据所选窗函数,自行设定。
利用所设计的FIR高通滤波器,对叠加了低频噪声的音频信号进行高通滤波,对比滤波前后音频信号的变化。
利用MATLAB软件进行系统建模,编写程序实现设计方案。
1、掌握用汉宁窗函数法设计FIR高通滤波器的原理和设计方法。
2、用MATLAB画出滤波前、后音频信号的时域波形和频谱图。
3、用MATLAB画出FIR高通滤波器幅频特性、相频特性图。
4、对音频信号进行滤波,验证所设计的滤波器。
5、撰写规范的课程设计报告。
利用汉宁窗设计FIR高通滤波器
1.2.1窗函数法设计FIR滤波器的基本思想
窗函数法的基本思想是要选取某一种合适的理想频率选择性滤波器,这种滤波器总是有一个非因果,无限长的脉冲响应,然后将它的脉冲响应截断(或加窗)以得到一个线性相位和因果的FIR滤波器,因为必须设计一个因果可实现的FIR滤波器[1]。
需要注意的是,数字滤波器的传输函数H(ejw)都是以2π为周期的,滤波器的低通频带处于2π的整数倍处,而高频频带处于π的奇数被附近,这一点和模拟滤波器是有区别的。
因为录制的音频信号是模拟信号,要想使用数字滤波器对叠加了噪声的信号进行滤波,则在设计数字滤波器之前首先要进行模数转换,将模拟信号转换为数字信号。
窗函数法设计FIR滤波器的步骤
主要设计步骤为:
(1)根据技术要求确定待求FIR滤波器的单位取样响应hd(n)。如果给出待求FIR滤波器的频率响应为Hd(ejw),那么单位取样响应使用的公式求出:
(2) 据过渡带宽及阻带衰减要求,选择窗函数的类型并估计窗口长度N(或阶数M=N-1),窗函数类型可根据最小阻带衰减As独立选择,因为窗口长度N对最小阻带衰减As没有影响,在确定窗函数类型以后,可根据过渡带宽小于给定指标确定所拟用的窗函数的窗口长度N,设待求滤波器的过渡带宽为Δw,它与窗口长度N近似成反比,窗函数类型确定后,其计算公式也确定了,不过这些公式是近似的,得出的窗口长度还要在计算中逐步修正,原则是在保证阻带衰减满足要求的情况下,尽量选择较小的N,在N和窗函数类型确定后,即可调用MATLAB中的窗函数求出窗函数w(n)。
(3) 计算滤波器的单位取样响应h(n),使用(1-2)的公式求出:
(4) 验算技术指标是否满足要求。
窗函数法设计FIR滤波器的要求
在使用窗函数法设计FIR滤波器时要满足以下两个条件:
(1)窗谱主瓣尽可能地窄,以获得较陡的过渡带;
(2)尽量减少窗谱的最大旁瓣的相对幅度,也就是使能量尽量集中于主瓣,减小峰肩和纹波,进而增加阻带的衰减。
本次课程设计先完成音频信号的采集,并对所采集的音频信号加入不同的干扰噪声,对加入噪声的信号进行频谱分析,针对受干扰音频信号的特点设计不同的滤波器,然后利用窗函数法设计低通,高通,带通等滤波器对采集到的音频信号进行滤波处理,分析音频信号各频率段的特性。对加噪信号进行滤波,恢复原信号。把原始音频信号、加噪音频信号和滤波后的信号进行时域变换和频域变换,画出它们的时域波形和频域波形图,从视觉角度比较分析滤波的效果。实现框图
采集:通过手机录一段音乐,并命名为chun.mp3
在MATLAB中,[y,Fs,bits]=wavread('chun.mp3');用于读取音频,采样值放在向量y中,Fs表示采样频率(Hz),bits表示采样位数。
sound(y);用于音频的播放,向量y代表一个信号,也是一个复杂的函数表达式,处理一个声音信号y。
在MATLAB中,实现音频的读入,并绘出了音频信号的原始信号图可采用Fs=11025; 音频信号的采样频率为44100,sound(y,Fs); 用于播放音频信号。
音频信号是一种非平稳的时变信号,它携带着各种信息。在音频编码、音频合成、音频识别和音频增强等音频处理中无一例外需要提取音频中包含的各种信息。音频信号分析的目的就在与方便有效的提取并表示音频信号所携带的信息。音频信号分析可以分为时域和变换域等处理方法,其中时域分析是最简单的方法,直接对音频信号的时域波形进行分析,提取的特征参数主要有音频的短时能量,短时平均过零率,短时自相关函数等。
如4.2 这段密密麻麻的波形就是手机录的音乐波形
FFT即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
对音频信号进行FFT变换就是为了得到它的频域的图形,便于从图中观察出信号的幅度等特性。如图3-3-1所示即为原始信号幅值图:
从频谱图可以看出,改分布频率在250Hz一下有很小的幅度,我们可以利用此低幅度频率来计算截止频率,从而设计出高通滤波器,减小原音频的损失。
在MATLAB软件平台下,给原始的音频信号叠加上噪声,噪声类型分为如下几种:白噪声、单频噪声(正弦干扰)、多频噪声(多正弦干扰)、其他干扰,可设置为低频、高频、带限噪声、Chirp干扰、冲激干扰。
这里我们选择四个单频正弦噪声,频率f设置为100,150,200,250Hz,与原音频相加即可得加噪声后的音频,我门画出加噪声后的音频时域和频域图。
与原始信号对比,加入噪声后的波形与原始信号相比出现了很大的区别,从时域图可以看出,幅度变得更加宽了,从频域图可以看出在200Hz左右出现了冲激函数曲线,即印证了我们所加的是正弦噪声。
将用sound函数进行播放加入噪声之后的音频,发现在伴随音乐播放的同时,有一低频声音也在干扰,所以加噪声后的音频设计成功。
数字滤波器的作用是利用离散时间系统的特性对输入信号波形(或频谱)进行加工处理,或者说利用数字方法按预定的要求对信号进行变换。
FIR滤波器可以得到严格的线性相位,然而由于FIR滤波器传输函数的极点固定在原点,所以只能用较高的阶数达到高的选择性;对于同样的滤波器设计指标,FIR滤波器所要求的阶数可以比IIR滤波器高5~10倍。
4.3.1理想高通滤波器
确定线性相位理想数字高通滤波器的单位冲激响应
4.3.2加汉宁窗的滤波器
阻带衰减不小于43.9dB
采样频率为Fs=44100Hz
依据上面所给原理,在MATLAB实现之后,进行画图检验性能指标
由上图4.6的幅频特性(db)曲线可知,最大衰减大于43.9db则验证成功,从幅频曲线(Hz)其通带截止频率为300Hz,阻带截止频率为250Hz,滤波器截止频率为275Hz,且由于滤波器的阶数高,所得曲线比较陡峭,则验证成功,
从相频曲线图可以看出滤波器,呈现线性相位,则为FIR滤波器,对不同频率的相位特征不同,则验证成功。
从脉冲响应图,可以看出此冲激响应大概位于序列1360-1380,之间很好的解释了高通滤波器的前项序列过滤,后项序列保留的特征,则验证成功。
由零极点图看出,在z=1处有零点,则为高通滤波器。
滤波器设计成功。
正在上传…重新上传取消正在上传…重新上传取消
将加噪声之后的音频在MATLAB中用filter函数进行滤波,所得结果进行可视化展示,与滤波结果和加噪声之后的结果进行对比。
由 图5. 可以清晰的对比出,原音频和加噪声之后的音频在275Hz之前都有小幅度,但经过滤波器的过滤之后,截止频率为275Hz的音频全部过滤去,在图中也可以清晰的对比出,音频的时域图也恢复的和原音频相同,并用sound函数进行播放对比,音频无失真,实验成功。
要求录制一段音频信号,要求长度不小于6秒,并对录制的信号进行采样。
在MATLAB中[y,fs,bits]=wavread();用于读取音频,sound(),用于音频播放。
音频信号是一种非平稳的时变信号,它携带着各种信息。音频信号分析的目的就在与方便有效的提取并表示音频信号所携带的信息。音频信号分析可以分为时域和变换域等处理方法,其中时域分析是最简单的方法,直接对音频信号的时域波形进行分析,提取的特征参数。音频信号经过FFT变换之后,就可以得到信号的频域图形,另外,频域图形使信号的某些特性变得更明显,信号的傅立叶表示在信号的分析与处理中起着重要的作用。因为对于线性系统来说,可以很方便地确定其对正弦或复指数和的响应,所以傅立叶分析方法能完善地解决许多信号分析和处理问题。
应用MATLAB 根据给定的技术指标进行FIR 数字滤波器设计时,可根据设计要求,以高通滤波器的冲激响应函数进行设计滤波器,可以加深对MATLAB的使用和对数字信号的理解。 使用汉宁窗设计高通滤波器,并对正弦噪声后的音频信号进行滤波。比较滤波前后的时域波形和频谱并进行分析。在频域波形中,我们可以明显的看到设计的滤波器对音频信号进行了滤波处理,将噪声进行了滤除。此次滤波基本达到了要求,完成了设计指标。
总之,加噪声的后的音频信号经过FIR滤波器的滤波处理,时域和频域图与原始信号都几乎一样,这说明噪声几乎全被滤掉了,同时也说明FIR滤波器设计还算理想,能满足所需要求。
本课程设计的主要目的是在MATLAB环境下,使用汉宁窗函数设计法设计一个FIR高通滤波器,并对叠加了正弦噪声后的音频信号进行滤波去噪。此次滤波基本达到了要求,完成了设计指标。
本次课设中遇到了很多问题,基础知识的不牢固,MATLAB程序编写函数的使用不熟悉都是问题,希望以后逐渐改进。
% % % 基于汉宁窗的FIR高通滤波器
clear
[x,Fs]=audioread('chun.mp3');
sound(x,Fs);
pause(7)
% % % 初始分析
N=length(x); % 计算信号x的长度
fn1=200; % 单频噪声频率
fn2=150;
fn3=100;
fn4=250;
t=0:1/Fs:(N-1)/Fs; % 计算时间范围,样本数除以采样频率
%%%四个单频合成噪声
noise=0.5*sin(fn1*2*pi*t)+0.5*sin(fn2*2*pi*t)+0.5*sin(fn3*2*pi*t)+0.5*sin(fn4*2*pi*t);
y=x'+noise; % 加入一个多频噪声
sound(y,Fs);
pause(7)% 可以杂声
X=abs(fft(x));
Y=abs(fft(y));% 对原始信号和加噪信号进行fft变换
X=X(1:N/2);
Y=Y(1:N/2); % 截取前半部分
df=Fs/ N; % 计算频谱的谱线间隔
f=0:df:Fs/2-df; % 计算频谱频率范围
subplot(2,2,1);plot(t,x);
%%%%%原与加噪之后的分析
title('原音频信号');
xlabel('时间(s)');
ylabel('幅度');
grid on;
subplot(2,2,2);plot(f,X);
axis([0,1500,0,3000]);
title('原音频信号频谱');
xlabel('频率(hz)');
ylabel('幅度谱');
grid on;
subplot(2,2,3);plot(t,y);
% axis([0,8,-0.3,0.3]);
title('加入四个单频噪声后的音频信号');
xlabel('时间(s)');
ylabel('幅度');
grid on;
subplot(2,2,4);
plot(f,Y);
axis([0,1500,0,3000]);
title('加入四个单频噪声后的音频信号频谱');
xlabel('频率(hz)');
ylabel('幅度谱');
grid on;
fp=300;fs=250;%通带和阻带截止频率
Rp=1;As=43.9;%通带和阻带衰减
fcd=(fp+fs)/2;% 高通滤波器设计指标,截止频率
df=fp-fs; % 计算频率间隔
wc=fcd/Fs*2*pi;% 截止频率(弧度)
dw=df/Fs*2*pi;
wsd=fs/Fs*2*pi;
M=ceil(6.2*pi/dw)+1; % 计算汉宁窗设计该滤波器时需要的阶数
n=0:M-1; % 定义时间范围
w_ham=hanning(M); % 产生M阶的汉宁窗
% M = 理想滤波器的长度
alpha = (M-1)/2;
n = 0:1:(M-1);
m = n - alpha + eps;
hd_bs=(sin(pi*m) - sin(wc*m))./(pi*m);
%%%%滤波器的形成
h_bs=w_ham'.*hd_bs; % 用窗口法计算实际滤波器脉冲响应
[H,w] = freqz(h_bs,1,1000,'whole');
H = (H(1:1:501))'; w = (w(1:1:501))';
mag = abs(H);
db = 20*log10((mag+eps)/max(mag));
pha = angle(H);
grd = grpdelay(h_bs,1,w);
% % % % 滤波器的性能指标
figure(2)
subplot(2,2,1);plot(w*Fs/(2*pi),db);
axis([0,600,-80,20]);
title('幅度特性(db)');
xlabel('f(Hz)');ylabel('db');
grid on;
subplot(2,2,2);plot(w*Fs/(2*pi),mag);
axis([0,600,-0.5,1.5]);
title('幅度特性曲线(Hz)');
xlabel('f(Hz)');ylabel('幅度');
grid on;
subplot(2,2,3);plot(w,pha);
axis([0,0.2,-3,3])
title('滤波器相频特性图');
xlabel('w/pi');ylabel('相位');
grid on;
subplot(2,2,4);plot(h_bs);
axis([1350,1400,-0.2,0.8]);
title('滤波器脉冲响应图');
xlabel('n');ylabel('h(n)');
grid on;
%%%%开始滤波
y_fil=filter(h_bs,1,y);% 用设计好的滤波器对y进行滤波
Y_fil=fft(y_fil);Y_fil=Y_fil(1:N/2); % 计算频谱取前一半
% % % 检验滤波
figure(3)
subplot(3,2,1);plot(t,x);
% axis([0,2.1,-0.05,0.08]);
title('原音频信号时域');
xlabel('时间t');ylabel('幅度');
grid on;
subplot(3,2,2);plot(f,X);
axis([0,1500,0,3000]);
title('原音频信号幅度谱');
xlabel('频率f');ylabel('幅度');
grid on;
subplot(3,2,3);plot(t,y);
% axis([0,2.1,-0.05,0.1]);
title('加噪声后的音频信号时域');
xlabel('时间t');ylabel('幅度');
grid on;
subplot(3,2,4);plot(f,Y);
axis([0,1500,0,3000]);
title('加噪声后的音频信号幅度谱');
xlabel('频率f');ylabel('幅度');
grid on;
subplot(3,2,5);plot(t,y_fil);
% axis([0,2.1,-0.05,0.1]);
title('滤波后音频信号时域');
xlabel('时间t');ylabel('幅度');
grid on;
sound(y_fil,Fs)
subplot(3,2,6);plot(f,Y_fil);
axis([0,1500,0,3000]);
title('滤波后音频信号幅度谱');
xlabel('频率f');ylabel('幅度');
grid on;
figure(4)
zplane(h_bs,1);
xlabel('rez'); ylabel('jImz');
title('传输零极点');