实验三 音频信号的分析与处理 1
一、实验目的
1. 掌握音频信号的采集以及运用 Matlab 软件实现音频回放的方
法;
2. 掌握运用 Matlab 实现对音频信号的时域、频谱分析方法;
3. 掌握运用 Matlab 设计 RC 滤波系统的方法;
4. 掌握运用 Matlab 实现对加干扰后的音频信号的进行滤波处理
的方法;
5. 锻炼学生运用所学知识独立分析问题解决问题的能力,培养学
生创新能力。
二、实验性质
设计性实验
三、实验任务
1. 音频信号的采集
音频信号的采集可以通过 Windows 自带的录音机也可以用专
用的录制软件录制一段音频信号(尽量保证无噪音、干扰小),也
可以直接复制一段音频信号,但必须保证音频信号保存为.wav 的
文件。
2. 音频信号的时域、频域分析
运用 Matlab 软件实现对音频信号的打开操作、时域分析和频
域分析,并画出相应的图形(要求图形有标题),并打印在实验报
告中(注意:把打印好的图形剪裁下来,粘贴到实验报告纸上)。
3. 引入干扰信号
在原有的音频信号上,叠加一个频率为 100KHz 的正弦波干扰
信号(幅度自定,可根据音频信号的情况而定)。
4. 滤波系统的设计
运用 Matlab 实现 RC 滤波系统,要求加入干扰的音频信号经
过 RC 滤波系统后,能够滤除 100KHz 的干扰信号,同时保留原有
的音频信号,要求绘制出 RC 滤波系统的冲激响应波形,并分析其
频谱。
14-5-9 下午7:42E:\MATLAB 文档\信号与系统\实验三...\audio.m
第 1 页,共 2 页
% 音频信号分析与处理
% 作者:长春理工大学电信学院 张圆星
%% 打开和读取音频文件
clear all; % 清除工作区缓存
[y, Fs] = audioread('jyly.wav'); % 读取音频文件
VoiceWav = y(300000 : 400000, 1); % 截取音频中的一段波形
clear y; % 清除缓存
hAudio = audioplayer(VoiceWav, Fs); % 将音频文件载入audioplayer
SampleRate = get(hAudio, 'SampleRate'); % 获取音频文件的采样率KHz
T = 1/SampleRate; % 计算每个点的时间,即采样周期
SampLen = size(VoiceWav,1); % 单声道采样长度
%% 绘制时域分析图
hFig1 = figure('Units', 'normalized', 'Position', [0 0.05 0.49 0.85]);
t = T: T: (SampLen* T);
subplot(2, 1, 1); % 绘制音频波形
plot(t, VoiceWav); % 绘制波形
title('音频时域波形图'); axis([0, 2.3, -0.5, 0.5]);
xlabel('时间(s)'); ylabel('幅值(V)'); % 显示标题
%% 傅里叶变换
subplot(2, 1, 2); % 绘制波形
myfft(VoiceWav, SampleRate, 'plot'); % 傅里叶变换
title('单声道频谱振幅'); % 显示标题
xlabel('Frequency (Hz)');
ylabel('|Y(f)|');
play(hAudio); % 播放添加噪声前的声音
pause(3);
%% 引入100KHz的噪声干扰
t = (0: SampLen-1)* T;
noise = sin(2 * pi * 10000 * t); % 噪声频率100Khz,幅值-1V到+1V
hFig2 = figure('Units', 'normalized', 'Position', [0.5 0.05 0.5 0.85]);
subplot(2, 1, 1); % 绘制波形
plot(t(1: 1000), noise(1: 1000));
title('100KHz噪声信号'); % 显示标题
noiseVoice = VoiceWav+ noise'; % 将噪声加到声音里面
hAudio = audioplayer(noiseVoice, Fs); % 将音频文件载入audioplayer
subplot(2, 1, 2); % 绘制波形
[fftNoiseVoice, f] = myfft(noiseVoice, SampleRate, 'plot');
title('音乐和噪声频谱'); % 显示标题
play(hAudio); % 播放添加噪声后的声音
pause(3);
14-5-9 下午7:42E:\MATLAB 文档\信号与系统\实验三...\audio.m
第 2 页,共 2 页
%% 设计RC滤波系统(二阶有源低通滤波器)
w = f;
Wc = 3000; % wc = 1/(RC),特征角频率
A0 = 1; % A0 = AVF < 3
Q = 1/(3 - A0); % 品质因素
H = A0* Wc^2 ./ ((j*w).^2 + Wc/Q * (j*w) + Wc^2); %二阶有源低通滤波器公式
hFig3 = figure('Units', 'normalized', 'Position', [0 0.05 0.49 0.85]);
subplot(2, 1, 1); % 绘制波形
plot(w, H); % 显示标题
title('二阶有源低通滤波器');xlabel('频率');ylabel('w/Wc');
AfterFilter = fftNoiseVoice .* H'; % 滤波
% AfterFilter = fftNoiseVoice;
%% 傅里叶逆变换
subplot(2, 1, 2); % 绘制波形
NFFT = 2^nextpow2(SampLen); % 根据采样求傅里叶变换的点
f = SampleRate/2 * linspace(0,1,NFFT/2+1); % 计算频率显示范围
plot(f, 2*abs(AfterFilter(1:NFFT/2+1))); % 绘制频域分析图
title('滤波以后的频谱');xlabel('频率');ylabel('w/Wc');
clear Y H;
FilterVoice = fftshift(ifft(AfterFilter)); % 傅里叶逆变换
FilterVoice = fftshift(FilterVoice);
FilterVoice = ((FilterVoice - max(max(FilterVoice)))/( max(max(FilterVoice)) ...
- min(min(FilterVoice)) )) + 0.5; % 归一化
clear AfterFilter w; % 清除缓存
hFig4 = figure('Units', 'normalized', 'Position', [0.5 0.05 0.5 0.85]);
subplot(2, 1, 1); % 绘制右声道波形
plot(t, FilterVoice(1:size(t,2), 1));
title('傅里叶逆变换图');
xlabel('时间(ms)'); ylabel('幅值(V)'); % 显示标题
hAudio = audioplayer(FilterVoice, Fs); % 将音频文件载入audioplayer
play(hAudio); % 播放添加噪声后的声音
%% 结束
14-5-9 下午7:43E:\MATLAB 文档\信号与系统\实验三...\myfft.m
第 1 页,共 2 页
% 我的快速傅里叶变换函数
% 作者:长春理工大学电信学院 张圆星
function [outFFT, Freq] = myfft(varargin)
% 输入参数格式:
% 1. 需要FFT变换的向量
% 2. 采样率SampleRate
% 3. 是否绘图,绘图‘plot‘,不绘图则不传递该参数
% 4. 单边显示:'half',全部显示:'full'
% 输出参数格式:
% 1. 转换完成的向量
% 2. FFT频率范围
%% 输出参数判断
switch nargin
case 0 | 1,
error('Less argument in!');
case 2,
FFTVector = varargin{1};
SampleRate = varargin{2};
isplot = 0;
case 3,
FFTVector = varargin{1};
SampleRate = varargin{2};
isplot = varargin{3};
plotmode = 'half';
case 4,
FFTVector = varargin{1};
SampleRate = varargin{2};
isplot = varargin{3};
plotmode = varargin{4};
otherwise
error('So many arguments in!');
end
%% FFT变换
SampLen = size(FFTVector,1); % 获取采样点
NFFT = 2^nextpow2(SampLen); % 根据采样求傅里叶变换的点
Y = fft(FFTVector, NFFT)/SampLen; % 傅里叶变换
f = SampleRate * linspace(0,1,NFFT); % 计算频率显示范围
%% 判断输出参数
if(nargout == 1)
outFFT = Y;
elseif(nargout ==2)
outFFT = Y;
Freq = f;
end
14-5-9 下午7:43E:\MATLAB 文档\信号与系统\实验三...\myfft.m
第 2 页,共 2 页
%% 判断绘图
if(strcmp(isplot, 'plot'))
if(strcmp(plotmode, 'full'))
plot(f, abs(Y(1:NFFT))); % 绘制频域分析图
else
f = SampleRate/2 * linspace(0,1,NFFT/2+1); % 计算频率显示范围
plot(f, 2*abs(Y(1:NFFT/2+1))); % 绘制频域分析图
end
title('FFT频谱'); % 显示标题
xlabel('Frequency (Hz)');
ylabel('|Y(f)|');
end
%% 结束
)
(
V
值
幅
音频时域波形图
0.5
1
时间(s)
单声道频谱振幅
1.5
2
0.5
0
-0.5
0
0.04
0.03
|
)
f
(
Y
|
0.02
0.01
0
0
0.5
1
1.5
2
Frequency (Hz)
2.5
x 104
1
0.5
0
-0.5
-1
0
1
0.8
0.6
0.4
0.2
0
0
|
)
f
(
Y
|
100KHz噪声信号
0.005
0.01
0.015
0.02
0.025
音乐和噪声频谱
0.5
1
1.5
2
Frequency (Hz)
2.5
x 104
c
W
w
/
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
0
0.04
0.03
c
W
w
/
0.02
0.01
0
0
二阶有源低通滤波器
0.5
1
1.5
2
2.5
3
3.5
4
频率
滤波以后的频谱
4.5
x 104
0.5
1
1.5
2
频率
2.5
x 104