目录
一、实验目的:
(1)录制不同采样率的语音数据,测试效果。
(2) 对语音信号进行分析傅里叶分析,分析不同语音频谱的区别。
(3)分别采用不同的采样率(100、500、1000、5000、10000等)对语音信号进行采样,测试语音播放效果,分析背后的原理。
(4)采用低通滤波器对语音信号进行处理,分析处理后对语音效果的影响及其原因。
二、实验分析:
2.1 实验原理分析:
本次实验为录取一段声音,对声音进行不同频率采样后进行时域、频域的分析,并且设计滤波器来对声音进行处理。分析其中原理。
采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔,不同采样率经过离散化而获得不同数量的声音数据。
从时域到频域其中涉及到FFT变化,FFT即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。变化结果可见图一所示:
图一:对时域FFT后图形
数字滤波(digital filtering):用数字设备,通过一定的算法,对信号进行处理,将某个频段的信号进行滤除,得到新的信号的这一过程叫做数字滤波。数字滤波器可以分为两大部分:即经典滤波器和现代滤波器。经典滤波器就是假定输入信号x(n)中的有用成分和希望滤除成分分别位于不同的频带,因而我们通过一个线性系统就可以对噪声进行滤除,如果噪声和信号的频谱相互混叠,则经典滤波器得不到滤波的要求。
通常有高通滤波器,低通滤波器,带通滤波器,带阻滤波器。现代滤波器是从含有噪声的信号估计出有用的信号和噪声信号。这种方法是把信号和噪声本身都视为随机信号,利用其统计特征,如自相关函数,互相关函数,自功率谱,互功率谱等引导出信号的估计算法,然后利用数字设备实现。本次设计了全通滤波与低通滤波对声音进行分析与处理。具体结果见图二:
图二: 带全通滤波与低通滤波后结果
2.2 GUI界面设计:
为了将声音进行收集后进行处理后播放并且将信号时域与频域波形进行显示,设计一个按键用于开始录制声音,一个按键用于波峰声音,并且利用六个坐标轴对时域、频域波形进行显示。具体设计见图三:
图三:整体GUI界面设计
三、实验源程序
分析:利用电脑的麦克风和 audiorecorder函数对声音进行采集并且利用audiowrite函数把收集的文件存储在电脑指定位置
fs=get(handles.slider1,'value');
%fs = 8000; % 采样频率
duration = 2; % 时间长度(秒)
% 创建一个录音文件:fs =8000Hz, 16-bit, 单通道
voice = audiorecorder(fs, 16, 1);
recordblocking(voice, duration); % 录音2秒钟
stop(voice);
y = getaudiodata(voice);
ymax = max(abs(y)); % 归一化
y = y/ymax;
audiowrite('D:\录音.wav',y,fs); % 存储录音文件
分析:由于录音的过程中已经将录音文件存储在电脑指定位置,所以,只需要读取指定位置的录音文件进行处理即可,利用plot函数,并且在plot函数中规定绘画的坐标轴handles.坐标轴名称。 如何规定x,y的标题后对原录音文件进行fft运算 利用函数X=fft(y,L), A = fftshift(X);后进行进行运算的图形绘制与指定坐标轴,并且将处理后声音进行播放。
fs=get(handles.slider1,'value');%fs = 8000; % 采样频率
duration = 2; % 时间长度(秒)
n = duration*fs; % 采样点数
t = (1:n)/fs;
y = audioread('D:\录音.wav'); %读取音频
plot(handles.axes1,t,y); % 画出声音的时域波形图
xlabel(handles.axes1,'时间/s'); % x轴标题
ylabel(handles.axes1,'相对信号强度'); % y轴标题
L = length(y);
X=fft(y,L);
A = fftshift(X);
A=abs(A);
ws = 2* pi* fs;
w1 = (-ws/2 + (0:L-1) * ws/L)/(2 * pi);
plot(handles.axes2,w1, abs(A));
xlabel(handles.axes2,'频率/Hz');
ylabel(handles.axes2,'幅度');
clear sound
sound(y);
分析:基础分析同上分析一致,将读取存储在计算机上的录音文件并且进行处理,由于是全体滤波器,需额外设置衰减系数、延迟时间长短后对滤波后的数据进行fft变化,将时域处理波形与频域处理波形绘制与指定坐标轴上并且将处理后的声音进行播放
fs=get(handles.slider1,'value');
y=audioread('D:\录音.wav');%读取wav格式音频文件
a=0.5;%设置衰减系数
R=2000;%延时的时间长短
B=[a,zeros(1,R-1),1];%系统分子
A=[1,zeros(1,R-1),a];%系统分母
[h,w]=freqz(B,A);%求系统频响特性的函数
y2=filter(B,A,y);%滤波输出
Y2=fft(y2,length(y));%滤波输出的fft
Y3=abs(Y2);
sound(y2,fs);%播放处理后的声音信号
axes(handles.axes3);%定位到图框3绘制图形(左下)
plot(handles.axes3,y2);
title('全通滤波结果的时域图');
axes(handles.axes4);%定位到图框4绘制图形(右下)
plot(handles.axes4,Y3(1:round(length(y)/2)-1));
title('全通滤波结果的频域图');
分析:低通滤波器设计理念为滤除高频的声音信号,其中需要设定截止频率; 阻带起始频率;通带纹波系数;阻带衰减系数;等参数,后续操作与全通滤波器操作一致
Fs=get(handles.slider1,'value');
fp = 1200; %通带截止频率 ;1200
fs= 2000; %阻带起始频率;2000
rp = 0.5; %通带纹波系数;0.5
rs =60; %阻带衰减系数;60
wp=2*pi*fp/Fs;
ws=2*pi*fs/Fs; %求出待设计的模拟滤波器的边界频率
[n,wn]=buttord(wp,ws,rp,rs,'s') %低通滤波器的阶数和截止频率
[b,a]=butter(n,wn,'s'); %滤波器的传输函数
[bz,az]=bilinear(b,a,0.5);
y = audioread('D:\录音.wav'); %读取音频
f=filter(bz,az,y); %滤波
f1=fft(f,1024);
plot(handles.axes8,abs(f1)); %滤波后的时域图
axes(handles.axes8);
title('滤波后的幅度谱');
grid;
plot(handles.axes9,angle(f1)); %滤波后的时域图
axes(handles.axes9);
title('滤波后的相位谱');
grid;
audiowrite('D:\录音.wav',f,Fs); %存储录音文件
z = audioread('D:\录音.wav'); %读取音频
sound(z); %播放录制的声音
四、实验结果分析:
4.1 声音FFT变化
对于收集声音并且进行fft变化,将时域信号变化到频域,可以得到,其时域的波形特点是由收集的声音频率的变化,变化到频域后由于双边傅里叶变化,可以看到信号关于0点俩边对称,并且呈现中间高、俩边低的趋势,这是由于傅里叶变化的性质决定,其中较高处为基波所对应片段,后续为谐波所对应波形。
4.2全通滤波器分析
全通滤波器具有平坦的频率响应,也就是说全通滤波器并不衰减任何频率的信号,全通滤波器(APF)虽然并不改变输入信号的频率特性,但它会改变输入信号的相位。利用这个特性,全通滤波器可以用做延时器、延迟均衡等,所以在播放声音时会出现声音的延迟现象。
4.3低通滤波器分析
低通滤波器利用电容通高频阻低频、电感通低频阻高频的原理。对于需要截止的高频,利用电容吸收电感、阻碍的方法不使它通过;对于需要放行的低频,利用电容高阻、电感低阻的特点让它通过。