大家好,又见面了,我是你们的朋友全栈君。
基于MATLAB的语音信号处理
【摘 要】
Matlab语音信号处理是指利用matlab软件对音频信号进行读取,并对音频信号进行采样分析及离散傅里叶变换,以方便对其在频域上进行调制滤波等相关的操作。本次实验在提取音频信号后会对该信号使用在MATLAB软件中设计的滤波器进行滤波,并观察其效果,验证滤波器是否可行。
本次使用了MATLAB软件,综合运用GUI界面设计、各种函数调用等来实现音频信号的傅里叶变换及滤波,程序界面简练,操作简便,具有一定的实际应用意义。软件中自带的信号处理与分析工具箱为语音信号分析实验提供了丰富的功能函数,利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化。信号处理是MATLAB重要应用的领域之一。
【关键词】 matlab 语音信号处理 数字滤波器 傅里叶变换
目 录
第1章 引言 4
1.1 音频信号处理研究意义 4
1.2 音频信号处理发展历程和现状 4
1.3 本课题的研究内容和问题 5
1.4 程序流程图 6
第2章 信号采集基本内容 7
2.1 MATLAB简述 7
2.2 采样位数和采样频率 7
2.3 音频信号采集依据:采样定理 7
2.4 倒谱概念 8
2.5 信号采集过程 8
2.6 傅里叶变换基础 9
2.7 MATLAB数字滤波器设计简述 10
第3章 音频信号处理 11
3.1 音频的采集与作图 11
3.2 对采集信号的加噪声处理 12
3.3 音量标准化 14
第4章 滤波器设计 16
4.1 数字滤波器原理 16
4.2 IIR与FIR滤波器区别 16
4.3 低通、高通和带通 17
4.4 双线性变换法与窗函数法 18
4.5 常用MATLAB滤波器设计函数 19
4.6 语音信号常用滤波性能指标 20
4.7 FDATOOL工具 21
4.8 用MATLAB设计滤波器实例 23
第5章 MATLABGUI设计 23
5.1 GUI介绍 26
5.2 GUI设计流程 27
5.3 小结内容 30
第6章 软件设计成品与使用 23
6.1 成品界面分类及介绍 26
5.2 使用效果 27
5.3 小结内容 30
结果分析 30
致 谢 31
参考文献 31
附录 32
附录1:对相同音频文件的滤波器滤波比较 32
附录2:实验中使用的主要M文件代码 35
第1章 引言
本章简要介绍了音频信号处理的研究意义、起源与发展以及国内外的研究现状,并依此提出了本论文研究的主要内容。
MATLAB是一种功能强大、效率高、交互性好的数值计算和可视化计算机高级语言,它将数值分析、信号处理和图形显示有机地融合为一体,形成了一个极其方便、用户界面友好的操作环境。本文就是在MATLAB基础上来进行音频信号参数的分析与处理的。
音频信号处理的研究意义
本课题旨在对音频文件的调制和滤波。音频信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一。通过声音传递信息是人类最重要、最有效、最常用和最方便的交换信息形式。同时,声音也是人与机器之间进行通信的重要工具,它是一种理想的人机通信方式,因而可为信息处理系统建立良好的人机交互环境,进一步推动计算机和其他智能机器的应用,提高社会的信息化程度。
语音信号是基于时间轴上的一维数字信号,在这里主要是对语音信号进行频域上的分析。在信号分析中,频域往往包含了更多的信息。对于频域来说,大概有8种波形可以让我们分析:矩形方波,锯齿波,梯形波,临界阻尼指数脉冲波形,三角波,余旋波,余旋平方波,高斯波。对于各种波形,我们都可以用一种方法来分析,就是傅立叶变换:将时域的波形转化到频域来分析。
语音信号处理是一门新兴的学科,同时又是综合性的多学科领域和涉及面很广的交叉学科。虽然从事这一领域研究的人员主要来自信号与信息处理及计算机应用等学科,但是它与语音学、语言学、声学、认知科学、生理学、心理学等许多学科也有非常密切的联系。
音频信号处理的发展历程和现状
在60年代,计算机的广泛应用推动了语音识别技术的发展,出现了多种语音信号分析方法,提出了动态规划(DP)和线性预测分析(LP)技术。其中后者较好地解决了语音信号产生模型的问题,对语音识别的发展产生了深远影响。 70年代,语音识别理论取得了突破。LP技术得到进一步发展,动态时间归正技术(DTW)基本成熟,特别是提出了矢量量化(VQ)和隐马尔可夫模型(HMM)理论。在实践上,实现了基于线性预测倒谱和DTW技术的特定人孤立语音识别系统。 80年代,HMM模型和人工神经元网络(ANN)成功应用于实践,并于1988年由CMU研制出了非特定人、大词汇量、连续语音识别系统—SPHINX。它可以理解由1000个单词构成的4200个句子,被认为是语音识别历史上的一个里程碑。HMM模型的广泛应用应归功于AT&T Bell实验室Rabiner等科学家的努力,他们把原本晦涩难懂的HMM纯数学模型工程化,从而为更多研究者了解和认识。ANN和HMM模型建立的语音识别系统,性能相当。 进入90年代,随着多媒体时代的来临,迫切要求语音识别系统从实验室走向实用。许多著名的大公司如IBM、苹果、AT&T和NTT都对语音识别系统的实用化研究投以巨资。
语音识别技术有一个很好的评估机制,那就是识别的准确率,而这项指标在20世纪90年代中后期实验室研究中得到了不断的提高。比较有代表性的系统有:IBM公司推出的Via Voice和Dragon System公司的Naturally Speaking Nuance公司的Nuance Voice Platform语音平台,Microsoft的Whisper Sun的Voice Tone等。语音识别也得到了更多的商用,其中SpeechWorks6是世界领先的电话自动语音识别系统解决方案提供者—SpeechWorks公司的代表产品。利用该产品,用户可以通过电话用自然语言与系统进行交互,进行旅游预约、股票交易、银行服务、订票服务、宾馆服务和寻呼服务等,无需服务人员的介入。目前市场上出现了语音识别电话、语音识别记事本等产品,如美国VPTC公司的VoiceOrganizer和法国的Parrot等。
在我国,语音技术的研究起步较晚,70年代末才开始了语音技术的研究,但在很长一段时间内,都处于缓慢发展的阶段,直到80年代后期,随着计算机应用技术在我国的逐渐普及和数字信号处理技术的进一步发展,国内许多单位纷纷投入到这项研究工作中去,其中有中科院声学所,自动化所,清华大学,四川大学和西北工业大学等科研机构和高等院校,大多数研究者致力于语音识别的基础理论研究工作、模型及算法的研究和改进。但由于起步晚、基础薄弱、计算机水平不发达,导致在整个80年代,我国在语音识别研究方面并没有形成自己的特色,更没有取得显著的成果和开发出大型性能优良的实验系统。
本课题的研究内容
在本科题中,所要研究的内容首先是语音的录入部分和对录入的音频数据进行频谱的分析并画出其图像。其次是设计滤波器并对加入噪声后的音频文件进行滤波并考察其使用情况以此来检验滤波器的设计是否正确。
本课题研究内容包括:
- 对音频信号进行采集:使用MATLAB中的wavread命令对音频文件进行采集。并使用sound命令对原信号进行播放用于对添加噪声后的信号进行对比。
- 图形用户界面GUI的设计:包含设置界面及按钮并对各按钮功能能进行编程。需要实现按键执行信号播放,加噪声和滤波的功能。
- 利用傅里叶变换求信号的频域并作图:使用MATLAB中的傅里叶变换命令对已经采集到的音频信号做傅里叶变换,变换完成后画出其在频域上的波形并对原时域上的波形进行对比。
- 对采样后的信号进行加噪声处理:使用matlab中的相关命令。WGN, AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。也可直接用randn函数产生高斯分布序列。
- 设计数字滤波器:设计一个数字滤波器时,根据指标先写出模拟滤波器的公式,再通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。
设计流程图
开始工作
对音频信号采集
音频信号的处理
验证滤波效果
添加噪声
对原信号进行傅里叶变换
使用滤波器对信号滤波
画图观察采集信号的时域波形
画图观察变换后信号的频域波形
使用不同种类的滤波器,观察区别
第2章 信号采集基本内容
Matlab简述
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户直接进行下载就可以用。
MATLAB主要可实现功能:
数值分析 | 数值和符号计算 | 工程与科学绘图 | 控制系统的设计与仿真 |
数字图像处理 | 数字信号处理 | 通讯系统设计与仿真 | 财务与金融工程 |
本次试验采用的MATLAB版本为2014a版
采样位数和采样频率
采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。
采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度范围。每增加一个采样位数相当于力度范围增加了6dB。采样位数越多则捕捉到的信号越精确。对于采样率来说你可以想象它类似于一个照相机,44.1kHz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机摄取的图片越多,对于原始音频的还原也越加精确。
音频信号采集依据:采样定理
对音频信号的采集时必须依据采样定理进行。如此方可避免在采集过程中造成的原信号丢失。
在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍;采样定理又称奈奎斯特定理。
频带为F的连续信号f(t)可用一系列离散的采样值f(t1),f(t1±Δt),f(t1±2Δt),…来表示,只要这些采样点的时间间隔Δt≤1/(2F),便可根据各采样值完全恢复原来的信号f(t)。 这是时域采样定理的一种表述方式。
时域采样定理的另一种表述方式是:当时间信号函数f(t)的最高频率分量为fM时,f(t)的值可由一系列采样间隔小于或等于1/(2fM)的采样值来确定,即采样点的重复频率f≥(2fM)。
倒谱概念
定义:倒谱定义为信号短时振幅谱的对数傅里叶反变换。
特点:具有可近似地分离并能提取出频谱包络信息和细微结构信息的特点
用途:
① 提取声道特征信息:提取频谱包络特征,以此作为描述音韵的特征参 数而应用于语音识别。
② 提取音源信息:提取基音特征,以此作为描述音韵特征的辅助参数而应用于语音识别。
求法:
A:短时信号;B:短时频谱;C:对数频谱; D:倒谱系数;E:对数频谱包络;
F:基本周期
信号采集过程
使用windows系统自带的录音软件进行录音。录音结束后将文件格式转换为适于MATLAB读取的WAV格式并保存。保存完成后打开MATLAB软件。确定文件是否在MATLAB的索引区域内,如果不在,使用读取命令的时候必须附加音频文件的地址。在命令行窗口中使用WAVREAD命令采集保存好的声音文件。该命令使用方法为:
y=wavread(file)%读取file所规定的wav文件,返回采样值放在向量y中。 [y,fs,bits]=wavread(file) %采样值放在向量y中。
fs表示采样频率。
bits表示采样位数。
y=wavread(file,N)%读取前N点的采样值放在向量y中。
y=wavread(file,[N1,N2])%读取从N1到N2点的采样值放在向量y中。
如果在实验中录入音频文件名为VOC1。则其相应的打开命令:y=wavread(voc1)
sound(x,fs,bits); 用于对声音的回放。向量y则就代表了一个信号(也即一个复杂的%26ldquo;函数表达式%26rdquo;)也就是说可以像处理一个信号表达式一样处理这个声音信号。
傅里叶变换基础
离散傅里叶变换(DFT),是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。
在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT,也应当将其看作经过周期延拓成为周期信号再作变换。
计算离散傅里叶变换的一种快速算法,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
由于本次分析的音频信号文件抽样点数过多,最少的点数仍约为1W点,使用原离散傅里叶变换函数会造成计算机运行的内存空间不足,故此次采用快速傅里叶变换。
MATLAB中调用快速傅里叶变换函数的命令为:
X=FFT(x);
返回应用快速傅立叶方法计算得到的矢量X的离散傅立叶变换(DFT), 如果 X为矩阵,fft返回矩阵每一列的傅立叶变换,如果X为多维数组,fft运算从第一个非独立维开始执行。
Y=fft(X)
返回应用快速傅立叶方法计算得到的矢量X的离散傅立叶变换(DFT), 如果 X为矩阵,fft返回矩阵每一列的傅立叶变换,如果X为多维数组,fft运算从第一个非独立维开始执行。
Y=fft(X,n)
返回n点的离散傅立叶变换,如果X的长度小于n,X中补0使其与n的长度相同,如果X的长度大于n,则X的多出部分将被删除;如X为矩阵,用同样方法处理矩阵列的长度。
一般而言,对于N点的x(n)序列的FFT是N点的复数序列,其点n=N/2+1对应Nyquist频率,作频谱分析时仅取序列X(k)的前一半,即前N/2点即可。X(k)的后一半序列和前一半序列时对称的。若N点序列x(n)(n=0,1,…,N-1)是在采样频率 下获得的。它的FFT也是N点序列,即X(k)(k=0,1,2,…,N-1),则第k点所对应实际频率值为f=k*f /N.作FFT分析时,幅值大小与FFT选择点数有关,但不影响分析结果。
用法实例:
t=linspace(0,2*pi,500);
y=[sin(t)];
subplot(2,1,1);
plot(t,y);
s=fft(y);
subplot(2,1,2);
plot(t,s);
此程序内容即为对一段SIN函数进行快速傅里叶变换并作图,结果如图。
matlab数字滤波器设计简述
滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程。滤波器的实现包括滤波器结构的选择和滤波器参数的计算。只有完成了滤波器的设计和实现,才能最终完成数据的滤波。
滤波器设计的目标是实现数据序列的频率成分变更。严格的设计规格需要指定通带波纹数、阻带衰减、过渡带宽度等。更准确的指定可能需要实现最小阶数的滤波器、需要实现任意形状的滤波器形状或者需要用fir滤波器实现。指定的要求不同,滤波器的设计也不同。
它可以理解为是一个计算程序或算法,给代表输入信号的数字时间序列转化为代表输出信号的数字时间序列,并在转化过程中,使信号按预定的形式变化。数字滤波器有多种分类,根据数字滤波器冲激响应的时域特征,可将数字滤波器分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。
不论是IIR滤波器还是FIR滤波器的设计都包括三个步骤:
(1) 按照实际任务的要求,确定滤波器的性能指标。
(2) 用一个因果、稳定的离散线性时不变系统的系统函数去逼近这一性能指标。根据不同的要求可以用IIR系统函数,也可以用FIR系统函数去逼近。
(3) 利用有限精度算法实现系统函数,包括结构选择、字长选择等。
平时所要设计的数字滤波器,阶数和类型并不一定是完全给定的,很多时候要根据设计要求和滤波效果不断地调整,以达到设计的最优化。在这种情况下,滤波器设计就要进行大量复杂的运算,单纯的靠公式计算和编制简单的程序很难在短时间内完成。利用MATLAB强大的计算功能进行计算机辅助设计,可以快速有效地设计数字滤波器,大大地简化了计算量,直观简便。
第3章 音频信号处理
音频的采集与作图
本次实验采用wavread命令对声音信号进行采集,在采集的过程中采样频率是由MATLAB软件自行定义的,由于录制声音采样率较低故可以不设定采样频率仅使用软件默认的采样频率进行采样。
以下展示的程序为语音信号在MATLAB中操作的表现,它实现了语音的读入打开,并利用FFT快速傅里叶变换绘出了语音信号的波形图频谱图。
编写M文件,定义名称为tryed:
clear all;
music=input(‘输入文件名:’,’s’)
[y,fs,nbits]=wavread(music); %音频信号的采集
sound(y,fs,nbits); %音频信号的播放
n=length(y); %设定长度
Y=fft(y,n); %快速傅里叶变换
figure; %控窗
subplot(2,1,1);
plot(y,’r’);
title(‘波形图’,’fontweight’,’blod’);
grid; %网格
subplot(2,1,2);
plot(abs(Y),’b’); %取绝对值
title(‘频谱图’,’fontweight’,’blod’);
grid;
程序运行结果:
如图所示,展示的是一段语音信号的时域和频域波形
对采集信号进行加噪声处理。
MATLAB中产生高斯白噪声的两个函数
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。
在设计中使用的是直接产生高斯噪声的RANDN函数,实验采用的是MATLAB中的随机函数rand产生噪声加入到语音信号中,通过对噪声信号的加入以此来实现模仿语音信号被污染,并对添加噪声后的文件进行频谱分析。
matlab函数randn:产生正态分布的随机数或矩阵的函数
randn
产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数。
用法:
Y = randn(n)
返回一个n*n的随机项的矩阵。如果n不是个数量,将返回错误信息。
Y = randn(m,n) 或 Y = randn([m n])
返回一个m*n的随机项矩阵。
Y = randn(m,n,p,…) 或 Y = randn([m n p…])
产生随机数组。
Y = randn(size(A))
返回一个和A有同样维数大小的随机数组。
在本次实验过程中,我们选用Randn(m,n)函数。对语音信号添加噪声及其频谱分析的主要程序如下:
clear all;
music=input(‘输入文件名:’,’s’)
[y,fs,nbits]=wavread(music);%语音信号的采集
n = length (y)
Noise=0.3*randn(n,2); %编辑噪声
s=y+Noise;
Y=fft(y,n);
sound(s);
S=fft(s);
figure;
subplot(2,2,1);
plot(y,’r’);
title(‘时域波形图’,’fontweight’,’bold’);
grid;
subplot(2,2,2);
plot(abs(Y),’r’);
title(‘频域波形图’,’fontweight’,’blod’);
subplot(2,2,3);
plot(s);
title(‘加噪时域波形图’,’fontweight’,’bold’);
grid;
subplot(2,2,4);
plot(abs(S));
title(‘加噪频域波形图’,’fontweight’,’bold’);
grid;
程序运行结果如下:
加噪后信号波形图
由图可见:在添加噪声后原本平滑的信号产生了大量不规则震动。在实际应用中这些噪声能够对原本的信号造成干扰,影响信号的正常读取,这时便需要采用滤波器对呗噪声污染的信号进行滤波,如此才能够正常读取相应的音频文件。
扩展内容:量标准化
录制声音过程中需对声音电平进行量化处理,最理想的量化是最大电平对应最高量化比特,但实际却很难做到,常有轻音问题。利用MATLAB很容易实现音量标准化,即最大电平对应最高量化比特。基本步骤是:先用wavread函数将.wav文件转换成列数组变量;再求出数组变量的极值并对所有元素作归一化处理;最后用wavwrite函数还原成音量标准化的.wav文件。
运行程序如下:
clear all;
music=input(‘输入文件名:’,’s’)
[y,fs,nbits]=wavread(music);%语音信号的采集
ym=max(max(max(y)),max(abs(min(y))));
x=y/ym;
figure;
subplot(2,1,1);
plot(y,’r’);
title(‘原图’,’fontweight’,’blod’);
grid; %网格
subplot(2,1,2);
plot(x,’b’);
title(‘改图’,’fontweight’,’blod’);
grid;
sound(x)
wavwrite(x,fs,bits,’2.wav’);
程序内容为:对原语音信号处理保存后播放并画出时域波形图,有音量增大的效果。但于实际测试播放时声音会有一定程度的失真。
程序运行结果:
如图,运行后相较于原波形图有了一定程度的幅度提高。
扩展内容2:信号的重采样
在语音信号的分析与处理过程中往往会对原语音信号进行重采样处理。经过重采样后能够减少程序的运行负担。在低配置的电脑系统中较为重要。
同时,重采样还能够带来降频和倍频的功能。在平时的信号处理中这种变换调整也经常要用到。所以在设计中也添加了这种功能,通过相关的处理可以使语音信号的声音特征产生一定的变化。在本次实验中,常通过重采样功能对声音信号进行调制。故在此进行部分说明。在本次软件使用时重采样功能多用于对原声音文件进行降频。
以下为本次实验中使用的重采样功能的部分代码:
fre=get(handles.popagainhz,’string’);
popup_sel_index = get(handles.popagainhz, ‘Value’);
switch popup_sel_index
case 1
fre=1000;
case 2
fre=2000;
case 3
fre=4000;
end
figure(4);
subplot(2,2,1);
plot(ft);
title(‘原始信号波形’);xlabel(‘时间’);ylabel(‘幅度’);
subplot(2,2,2);
Y=fft(ft);
plot(abs(Y));
title(‘原始信号频谱’);xlabel(‘频率’);ylabel(‘幅度’);
%重采样
y2=resample(ft,1,Fs/fre);
sound(y2,fre);
subplot(2,2,3);
plot(y2);
title(‘重采样后信号波形’);xlabel(‘时间’);ylabel(‘幅度’);
subplot(2,2,4);
Y2=fft(y2);
plot(abs(Y2));
title(‘重采样后信号频谱)’);xlabel(‘时间’);ylabel(‘幅度’);
第4章滤波器设计
数字滤波器原理
所谓数字滤波器,是指输入,输出均为数字信号,通过一定运算关系改变输入信号所含 频率成分的相对比例或者滤除某些频率成分的硬件。 实质上就是一个由有限精度算法实现的线性时不变离散系统。 它的基本工作原理是利用离散系统的特性对系统输入信号进行加工和变换, 改变输入序列的频谱或信号波形, 让有用的频率分量通过, 抑制无用的信号分量输出,根据其频率特性同样可以分为低通,高通,带通,带阻。如果要处理的信号是模拟信号,就可以通过 A/D 或者 D/A 转换,在信号形式上进行匹配转换,同样可以使用数字滤波器对模拟信号进行滤波
设计数字滤波器的任务就是寻求一个因果稳定的线性时不变系统,并使系统函数H(z)具有指定的频率特性。
数字滤波器从实现的网络结构或者从单位冲激响应分类,可以分成无限长单位冲激响应(IIR)数字滤波器和有限长单位冲激响应(FIR)数字滤波器。
数字滤波器频率响应的三个参数:
(1) 幅度平方响应:
(2) 相位响应
其中,相位响应
(3) 群时延响应
IIR滤波器与FIR滤波器区别
IIR数字滤波器:
IIR的设计理念是这样的:根据所要设计滤波器的参数去确定一个模拟滤波器的传输函数,然后再根据这个传输函数,通过双线性变换、或脉冲响应不变法来进行数字滤波器的设计。它的设计比较复杂,复杂在于它的模拟滤波器传输函数H(s)的确定。这一点我们可以让软件来实现。然后,我们说一下它的具体实现步骤:首先你要先确定你需要一个什么样的滤波器,巴特沃斯型,切比雪夫型,还是其它什么型的滤波器。当你选定一个型号后,你就可以根据设计参数和这个滤波器的计算公式来确定其阶数、传输函数的表达式。通常这个过程中还存在预扭曲的问题(这只是双线性变换法所需要注意的问题,脉冲响应不变法不存在这种问题)。确定H(S)后,就可以通过双线性变换得到其数字域的差分方程。
与fir滤波器的设计不同,IIR滤波器设计时的阶数不是由设计者指定,而是根据设计者输入的各个滤波器参数(截止频率、通带滤纹、阻带衰减等),由软件设计出满足这些参数的最低滤波器阶数。在matlab下设计不同类型IIR滤波器均有与之对应的函数用于阶数的选择。
IIR滤波器的公式为:
FIR数字滤波器:
FIR滤波器的设计比较简单,就是要设计一个数字滤波器去逼近一个理想的低通滤波器。通常这个理想的低通滤波器在频域上是一个矩形窗。根据傅里叶变换我们可以知道,此函数在时域上是一个采样函数。通常此函数的表达式为:
sa(n)=sin(n∩)/n∏,但是这个采样序列是无限的,计算机是无法对它进行计算的。故我们需要对此采样函数进行截断处理。也就是加一个窗函数。就是传说中的加窗。也就是把这个时域采样序列去乘一个窗函数,就把这个无限的时域采样序列截成了有限个序列值。但是加窗后对此采样序列的频域也产生了影响:此时的频域便不在是一个理想的矩形窗,而是成了一个有过渡带,阻带有波动的低通滤波器。通常根据所加的窗函数的不同,对采样信号加窗后,在频域所得的低通滤波器的阻带衰减也不同。通常我们就是根据此阻带衰减去选择一个合适的窗函数。如矩形窗、汉宁窗、汉明窗、BLACKMAN窗、凯撒窗等。选择一个具体的窗函数之后,根据所设计滤波器的参数来计算所需的阶数、此窗函数的表达式。然后用这个窗函数去和采样序列相乘,就可以得到实际滤波器的脉冲响应。
FIR滤波器的滤波计算公式为:
y(k)=a0x(k)+a1x(k+1)+a2x(k+2)+…+amx(k+m) k=0,1,…,N-m
低通,高通,带通概念
低通,高通,带通:
低通滤波器:对于不同滤波器而言,每个频率的信号的减弱程度不同。当使用在音频应用时,它有时被称为高频剪切滤波器, 或高音消除滤波器。低通滤波器概念有许多不同的形式,其中包括电子线路(如音频设备中使用的hiss 滤波器、平滑数据的数字算法、音障(acoustic barriers)、图像模糊处理等等,这两个工具都通过剔除短期波动、保留长期发展趋势提供了信号的平滑形式。低通滤波器在信号处理中的作用等同于其它领域如金融领域中移动平均数(moving average)所起的作用;低通滤波器有很多种,其中,最通用的就是巴特沃斯滤波器和切比雪夫滤波器。
高通滤波器:去掉信号中不必要的低频成分,去掉低频干扰的滤波器。在电力系统中,谐波补偿时用高通滤波器滤除某次及其以上的各次谐波。高通滤波器是指车载功放中能够让中、高频信号通过而不让低频信号通过的电路,其作用是滤去音频信号中的低音成分,增强中音和高音成分以驱动扬声器的中音和高音单元。此外高通滤波器常常和低通滤波器成对出现,不论哪一种,都是为了把一定的声音频率送到应该去的单元。
带通滤波器:能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。一个模拟带通滤波器的例子是电阻-电感-电容电路(RLC circuit)。这些滤波器也可以用低通滤波器同高通滤波器组合来产生。
对低通滤波器,有滤波器系数计算公式:
对高通滤波器,有滤波器系数计算公式:
对带通滤波器,有滤波器系数计算公式:
例如,以FIR低通滤波器设计为例,设采样频率FN=10kHz,截止頻率f1=1kHz ,有:
双线性变换法与窗函数法
双线性变换:
双线性变换法常用于模拟滤波器转数字滤波器,双线性变换法为了克服频谱混叠现象,采用非线性频率压缩方法,将整个频率轴上的频率范围压缩。
对于数字高通、带通滤波器的设计,通用方法为双线性变换法。可以借助于模拟滤波器的频率转换设计一个所需类型的过渡模拟滤波器,再经过双线性变换将其转换策划那个所需的数字滤波器。具体设计步骤如下:
(1)确定所需类型数字滤波器的技术指标。
(2)将所需类型数字滤波器的边界频率转换成相应的模拟滤波器的边界频率,转换公式为Ω=2/T tan(0.5ω)
(3)将相应类型的模拟滤波器技术指标转换成模拟低通滤波器技术指标。
(4)设计模拟低通滤波器。
(5)通过频率变换将模拟低通转换成相应类型的过渡模拟滤波器。
(6)采用双线性变换法将相应类型的过渡模拟滤波器转换成所需类型的数字滤波器。 我们知道,脉冲响应不变法的主要缺点是会产生频谱混叠现象,使数字滤波器的频响偏离模拟滤波器的频响特性。为了克服之一缺点,可以采用双线性变换法。
公式:
窗函数法:
理想滤波器单位脉冲响应Cn往往都是无限长序列,而且是非因果的,但FIR的滤波器系数h(n)长度是有限的,最简单的办法就是按滤波器系数长度直接截取其一段来代替。这样的突然截断在时域有跳变,导致设计出的滤波器特性变差。
为了改善设计滤波器的特性,用可以用一个向两边衰减的窗函数与理想滤波器单位脉冲响应相乘:h(n)=w(n) C(n),减小系数截断带来的时域有跳变造成的误差。
设计中常用的几种窗函数:
矩形窗w(n)=RN(n);
Hanning窗
常用的matlab滤波器设计函数
滤波函数:
filter:利用递归滤波器(IIR)或非递归滤波器(FIR)对数据进行数字滤波;
fftfilt:利用基于FFT的重叠相加法对数据进行滤波,只适用于非递归滤波器(FIR);
filter2:二维FIR数字滤波;
filtfilt:零相位滤波(IIR与FIR均可)
滤波器特性分析:
脉冲响应Impz:
等价于使用函数filter输入一个脉冲信号x=[1;zero(N-1,1)]。
频率响应freqz与freqs:
Freqz:求解数字滤波器的频率响应
Freqs:求解模拟滤波器的频率响应
直接滤波器设计函数:
besself,butter,cheby1, cheby2, ellip
阶数预测函数:
buttord, cheb1ord, cheb2ord, ellipord
低通模拟原型函数:
besselap, buttap, cheb1ap, cheb2ap, ellipap
频率变换函数:
lp2bp, lp2bs, lp2hp, lp2lp
主要函数调用格式:
函数filter的调用格式为:
y=filter(b,a,x)
该格式采用数字滤波器对数据进行滤波,既可以用于IIR滤波器,也可以用于FIR滤波器。其中向量b和a分别表示系统函数的分子、分母多项式的系数,若a=1,此时表示FIR滤波器,否则就是IIR滤波器。该函数是利用给出的向量b和a,对x中的数据进行滤波,结果放入向量y。
函数fftfilt 函数fftfilt的调用格式为:
y=fftfilt(b,x) 该格式是利用基于FFT的重叠相加法对数据进行滤波,这种频域滤波技术只对FIR滤波器有效。该函数是通过向量b描述的滤波器对x数据进行滤波。 关于用butter函数求系统函数分子与分母系数的几种形式。 [b,a]=butter(N,wc,’high’):设计N阶高通滤波器,wc为它的3dB边缘频率,以 为单位,故 。
[b,a]=butter(N,wc):当wc为具有两个元素的矢量wc=[w1,w2]时,它设计2N阶带通滤波器,3dB通带为 ,w的单位为 。
[b,a]=butter(N,wc,’stop’):若wc=[w1,w2],则它设计2N阶带阻滤波器,3dB通带为 ,w的单位为 。 如果在这个函数输入变元的最后,加一个变元“s”,表示设计的是模拟滤波器。这里不作讨论。
为了设计任意的选项巴特沃斯滤波器,必须知道阶数N和3dB边缘频率矢量wc。这可以直接利用信号处理工具箱中的buttord函数来计算。如果已知滤波器指标 , , 和 ,则调用格式为 [N,wc]=buttord(wp,ws,Rp,As) 对于不同类型的滤波器,参数wp和ws有一些限制:对于低通滤波器,wp<ws;对于高通滤波器,wp>ws;对于带通滤波器,wp和ws分别为具有两个元素的矢量,wp=[wp1,wp2]和ws=[ws1,ws2],并且ws1<wp1<wp2<ws2;对于带阻滤波器wp1<ws1<ws2<wp2。
语音信号常用的滤波性能指标
低通滤波器的性能指标: fp=1000Hz,fc=1200Hz,As=100db ,Ap=1dB
高通滤波器的性能指标: fp=3500Hz,fc=4000Hz,As=100dB,Ap=1dB;
带通滤波器的性能指标: fp1=1200Hz,fp2=3000hZ,fc1=1000Hz,fc2=3200Hz,As=100dB,Ap=1dB
FDATOOL工具
在MATLLAB软件中包含了系统自带的滤波器设计工具箱。此工具箱为使用者提供了一个图形化的滤波器设计与分析的界面,它可以更加直观的显示出滤波器的各类参数,如滤波器的频幅响应,相位响应,零极点的分布图等。产生的数字滤波器可直接存储为M文件,方便在MATLAB命令中的调用。
使用该工具箱可以在一定程度上简化滤波器的设计。本文中的部分滤波器的参考样本便是由FDATOOL工具生成的。本文中在实验的过程中仅采用了滤波器的设计部分和输出M文件部分,故其它相关的功能不再详细介绍。
MATLAB6.0以上版本均包含有FDATOOL工具。不同的版本其相对应的操作界面也略有不同,下面介绍的FDATOOL版本为MATLAB2014A中自带的版本,
具体使用方法:
打开用户界面,在MATLAB命令行中输入FDATOOL则弹出窗口如下
下列选项卡是对滤波器的类型和采用函数的选择,可根据要求点选
下列选项是对系统参数的选择,可根据要求输入详细的变量
选择完成后点击左下角命令产生滤波器的预览图形,如图:
完成设计后,需要将其内容另存为M文件以便于进行更改,如图:
如图,打开FILE选项卡,选择GENERATE MATLAB CODE命令 并根据实验要求选择保存内容。
经过保存后便可得到相应的滤波器M文件。
但是保存后的滤波器并不能直接使用,需要对其生成的M文件进行适当的修改以使其能够正确的处理对应的矩阵。同时使用该方法设计的滤波器并不包含作图功能,需要在M文件中编辑PLOT程序进行补完。
用matlab设计滤波器功能验证
使用MATLAB进行滤波演示,验证滤波器的使用效果:
本程序首先用SIN ,COS产生一段波形函数矩阵并对其进行添加噪声处理,其次设计出针对噪声进行过滤的滤波器,使用滤波器对MATLAB产生的噪声信号进行滤波,画出滤波前后的波形图并验证滤波效果。
程序命令:
t=[0:1/1000:1];
q=cos(2*pi*t); %定义矩阵
s=sin(2*pi*q);
N=length(s);
y=s+0.6*rand(1,N); %加噪声
subplot(2,1,1);
plot(y,’r’);
title(‘加噪语音信号的时域波形’);
S=fft(y);
subplot(2,1,2);
plot(abs(S),’b’);
title(‘加噪语音信号的频域波形’);
%%%%%%%%%%%%%%%%%%%%%%%%%滤波器部分%%%%%%%%%%%%%%%%%%%%%%%%
Ft=8000; %采样频率
Fp=1000; %阻带截至频率
Fs=1200; %通带截至频率
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;
[n11,wn11]=buttord(wp,ws,1,50,’s’); %求低通滤波器的阶数和截止频率
[b11,a11]=butter(n11,wn11,’s’); %求S域的频率响应的参数
[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换
sound(z11);
m11=fft(z11); %求滤波后的信号
figure;
subplot(2,2,1);
plot(abs(S),’r’);
title(‘原信号频谱’);
grid;
subplot(2,2,2);
plot(abs(m11),’b’);
title(‘滤波信号频谱’);
grid;
subplot(2,2,3);
plot(y,’r’);
title(‘原信号波形’);
grid;
subplot(2,2,4);
plot(z11,’b’);
title(‘滤波后的信号波形’);
grid;
程序运行结果:
由图可得,前后信号有一个相当直观的对比,对滤波器的设计达到了效果。在MATLAB软件中通过具体的图像显示确实的达到了滤波的功能。对比滤波前后的信号,滤波后的信号更加平滑,因此在MATLAB上进行滤波器设计可行。
实验软件所使用到的滤波器代码:
本次实验采用了调用函数chb1ap的切比雪夫滤波器,和调用函数buttap的巴斯沃特滤波器,两者均为低通模拟原型函数。以下是两滤波器设计原型:
%%%%%%%%%%%%%%%%butt%%%%%%%%%%%%%%%%%
function [b,a]=u_buttap(N,Omegac)
[z,p,k]=buttap(N);
p=p*Omegac;
k=Omegac^N;
B=real(poly(z));
b=B;
a=real(poly(p));
%%%%%%%%%%%chb1ap%%%%%%%%%%%%%%
function [b,a]=u_chb1ap(N,Rp,Omegac)
[z,p,k]=cheb1ap(N,Rp);
a=real(poly(p));
aNn=a(N+1);
p=p*Omegac;
a=real(poly(p));
aNu=a(N+1);
k=k*aNu/aNn;
B=real(poly(z));
b=k*B;
第5章MATLAB GUI设计
GUI介绍:
MATALB 可以创建图形用户界面GUI ( GraphicalUser Interface) ,它是用户和计算机之间交流的工具。MATLAB为GUI设计一共准备了4种模板,分别是Blank GUI(默认) 、GUI with Uicontrols(带控件对象的GUI模板) 、GUI with Axes and Menu(带坐标轴与菜单的GUI模板)与Modal Question Dialog(带模式问话对话框的GUI模板)。
GUI设计面板是GUI设计工具应用的平面,面板上部提供了菜单和常用工具按钮,左边提供了多种如命令按钮、单选按钮、可编辑文本框、静态文本框、弹出式菜单等。进行设计时, 首先单击面板左边所需的控件, 然后在右边的图形界面编辑区中再次单击某一恰当位置, 这时将在该位上为图形界面添加相应的控件。一个图形界面的完成, 除了设计其外观外, 还有相当的一部分是通过属性的设来完成的。因此在设置这些属性时, 要注意下面几个常用又很重要的属性设置:
BackgroundColor:设置控件背景颜色,使用[R G B]或颜色定义。
Style:控件对象类型。
CallBack属性:是连接程序界面整个程序系统的实质性功能的纽带。该属性值应该为一个可以直接求值的字符串,在该对象被选中和改变时,系统将自动地对字符串进行求值。
MATLAB制作GUI过程是非常方便的, 我们可以通过GUI操作来看到。该环境下要设计一个界面友好的仿真软件,一般应完成以下两个步骤:
(1)GUI界面设计。主要是通过不同的文本框、按钮等许多工具的使用,设计出一个图形用户界面。要清楚这个图形界面的功能是什么,即在图形界面上的操作会引发什么样的结果。
(2)回调函数的设计。用户应根据设计好的图形界面的功能,针对各个不同的图形对象来编写出能够实现该功能的函数代码,确保这个图形界面能够完成所预定的功能。
GUI设计流程:
1在MATLAB中点击新建打开图形用户界面
2选择blankGUI选项
3拖动需要数量的按钮到右边网格
操作步骤如上图所示,如果需对已有的GUI进行更改则选择打开现有的GUI。当需要排列多个按钮时则点击界面中的按钮组选项,将其拖入右边网格。
4按钮拖动完成后根据需要对按钮进行进一步设置,操作方法为双击按钮
如图所示:右图的检查器窗口为双击按钮后的设置窗口。
5对按钮设置完成后则进行文字说明以及功能的编辑使其关联M文件。
此命令选项是对按钮名称的设定。
此命令是对颜色的设置。
此命令是其核心命令之一,指对按键实现的功能进行设定。点击此按钮以使其关联的M文件运行就需要在CALLBACK中进行设置。
CALLBACK命令使用方法:
hObject: 图形界面的句柄;
eventdata: 为了兼容将来版本的保留接口,可忽略;
handles: 可以理解成一个全局的structure,用来传输所需要的数据,可以往handles里面任意添加成员数据,比如handles.m_NewData = 0;
如有一个按钮,点击后使MATLAB产生一个surf图形,则编写如下如下:
function pushbutton_Callback(hObject, eventdata, handles)
surf(handles.current_data);
而handles.current_data可以是外面其他控件设定的,也可以是由自己设定的内容。
双击CALLBACK窗口按键后 弹出设置如下:
关联M文件的方法为在function内容行下添加所需要执行的M文件名,如图:
此时按钮实现的功能为:点击按钮后执行名称为tryed的M文件。执行前需确认M文件处于NATLAB软件工作环境内或索引目录中。
小结:
通过上述操作,使用MATLAB设计音频信号的滤波器实验完成。在MATLAB中打开GUI点击相应的按键便能够启动相关联的M文件,对音频信号可进行加噪和滤波的功能。
利用CALLBACK命令。共关联了有:采集,添加噪声,波形显示等按键功能,但是其按键能否实现设计要求需要在具体实验经过实际测试方能验证。经过实际采样等一系列操作后,验证软件确实运行正常,图形显示基本正确,能够实现一定的滤波功能。
结果分析
本次实验采用MATLAB软件对音频信号进行处理,主要内容是对音频信号的采集利用,对音频信号添加噪声,设计数字滤波器,对添加噪声的音频信号进行滤波。滤波后显示原信号的波形与滤波后的信号波形,并进行观察。滤波完成后回放语音信号验证滤波效果。通过GUI界面的设计的关联基本实现了上述内容,以下是实验中遇到的具体问题分析。
首先:在实际实验中经过对比发现,录制后选取的音频文件采样率普遍约为:FS=22050,或是上述采样频率的一半。根据语音信号的特殊要求,选取的音频文件采样率普遍较高,添加噪声并保存时无法保存完整的声音文件,保存后的文件已经存在了一部分失真。故在之后的滤波过程中,虽然确实有滤波的效果,但是并未达到预期的水平。但是直接读取原声音文件加噪后滤波,以此来跳过使用WAVWRITE时声音丢失的话,滤波的效果会相对有部分的提高。
在滤波器的设计过程中,可选择的滤波器种类繁多,有各种阻带的以及利用不同函数设计的滤波器,在选取上普遍采用了双线性法设计的IIR滤波器进行滤波。滤波器的M文件代码部分由实验者自行设计另一部分来自于教科书或网络中提供的滤波器模型。设计时还采用了MATLAB自带的滤波器设计工具箱FDATOOL但该工具的使用方法并非本文应介绍的内容故没有进行详细解释。
这次实验利用了快速傅里叶变换功能获取音频信号的频谱图。利用了双线性法设计了多数的滤波器。基本实现了滤波的功能。经过GUI的设计后,软件更加便于操作。由于仅针对音频信号滤波它的体积更加小巧操作相对也更加简洁。
在实验中亦发现可以改进的地方,原本设计中仅使用了一种滤波器无法较好的通过对比来看出各种滤波器的区别,故增加了五种滤波器涵盖了低通,高通,带通三个滤波频段。滤波时性能指标是固定的,在未来的改进中会争取加入用户设定采样率和通带阻带的功能。实际使用时遇到了滤波效果不理想的问题,应是滤波器函数设计时精度上还有不少缺陷。滤波后会仍有部分杂音原声音信号有时会较难分辩,故不适用与需要高精度滤波的场合。由于使用MATLAB计算,操作时会遇到一些采样率过高或者体积较大的音频信号因内存不足的原因无法读取,因此软件亦不适合大文件的滤波。
综上所述,使用MATLAB处理音频信号的实验完成。基本实现了音频信号的采集和滤波,体现了各种滤波器在滤波时的区别,符合设计基本要求。
参考文献
[1] 郑春佳、陈仅星、陈金西,【数字信号处理-基于数值计算】西安电子科技大学出版社.
[3] 刘卫国,【matlab程序设计与应用】高等教育出版社.
[3] 胡航,【语音信号处理】哈尔滨工业大学出版社.
[4] 刘幺和、宋庭新,【语音识别与控制技术】,科学出版社.
[5] 苏金明、张莲花、刘波,【MATLAB工具箱应用】,电子工业出版社.
[6] 赵新敏,(语音信号的识别技术),学位论文,天津大学.
[7] 网友,(基于MATLAB的有噪声引号处理),学位论文,南京大学
[8] 王京辉,(语音信号处理技术研究) 论文,山东大学.
[9] 赵力,语音信号处理,机械工业出版社.
[10] 陈杰,【Matlab宝典】电子工业出版社.
[11] (美) Sanjit K. Mitra著;孙洪, 余翔宇等译.【数字信号处理实验指导书】
[12] 杨述斌,李永全,【数字信号处理实践教程】华中科技大学出版社
[14] Gersho A,Gr R M.Vector quantization and signalCompression,Boston,Kluwer Academic Publishers.
附录
附录1:同声音文件用不同种类滤波器滤波的图像对比
IIR低通:
IIR高通:
IIR带通:
FIR低通:
FIR高通:
FIR带通:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141426.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...