这是之前使用MATLAB做的一个项目,来对语音信号进行分析处理,设计语音信号的导入及播放操作,读取信号长度、画图及生成滤波等操作,MATLAB小白可零基础上手,只要跟着教程一步一步来就可以,非常简单。
具体教程已上传CSDN,可自行查看
https://blog.csdn.net/weixin_44936771/article/details/107726586?utm_source=app
后续会上传源码及文件,请关注并收藏。
##设计题目及要求
1.设计题目:时频域乐器信号的分析与处理
2.设计目标:对乐器不同音阶信号进行时频域分析和处理的基本方法
3.设计要求
(1)分别录制钢琴、吉他、口琴等乐器在不同音阶的声音文件,并将文件导入Matlab中;
(2)分别分析各乐器(两种或两种以上)的不同音阶声音的频谱,绘制其频谱图,分析声音信号的频谱;
(3)设计相应的滤波器,剔除声音信号的高频谐波,并分析滤波信号的频谱;
(4)生成滤波后的语音文件,分析听觉效果。
##下面开始详细教程
一.创建脚本,导入音频文件并播放
1.在MATLAB中创建一个新脚本并保存
2.选择音频文件导入MATLAB中并播放
(1)首先要注意的是MATLAB处理的音频信号为波形文件,.wav格式,所以不能直接导入.mp3等格式,
改格式直接修改后缀名即可;
(2)注意一定要将要处理的音频文件放到运行目录下;
(3)接下来在脚本中导入音频文件
[MU,fs]=audioread('piano.wav');
这里用到的函数是audioread,这个一般是通用的,任何版本都可以用。函数中需要写出
要导入的音频文件,注意文件名称中不能有中文!
audioread函数为采集音频信号数据,采样值将放在向量MU中,fs为表示采样频率。
MU和fs可根据喜好修改为其他名字。
(4)在MATLAB中该播放音频
sound(MU,fs);
这里只需要一个函数即可,无需过多解释。
二.画出信号的时域波形
plot(MU); //直接画出数组MU的图形,即为时域图
title('初始信号波形'); //设置图像的标题
xlable('时间'); //设置图像X轴名称
ylable('幅度'); //设置图像Y轴名称
grid //在图中添加网格线,增加可读性
##注意:
这里仅仅为作时域图的方法,在建立整个项目时还需要考虑美观性等因素,一般来说需要
建立一个专门的图形界面,完整整合代码将会放在后面。
三.进行快速傅里叶变化及数据选取
1.计算信号长度
n=length(MU);
2.快速傅里叶变化
MU1=fft(MU,n);
数据MU傅里叶变化后的数据将储存到MU1中
3.选取一半数据
len = round((length(MU1))/2);
这里要注意傅里叶变化后的数据为一个对称图形,这里为了美观性选取了其中的一般数据,这里无所谓,影响不大
四.画出频域图像
plot(abs(gq1(1:len))); //画出频谱图
title('初始信号频谱'); //设置标题
xlabel('频率'); //设置X轴名称
ylabel('幅度'); //设置Y轴名称
grid on //添加网格线
五.构建滤波器
这里我用的是MATLAB自带的fdatool工具来构建的滤波器,在MATLAB中直接输入fdatool就可以打开这个工具。
这里有两种滤波器可供选择,IIR滤波器和FIR滤波器,本人使用的是IIR滤波器。
具体参数可根据自己需要进行设置。
设置好参数后需要将滤波器模型导出,具体步骤如下:
File-Export
在弹出的窗口中,Export To这里选择MAT-File,Export As这里选择Objects
之后点击下方Export,保存文件就可以到处滤波器的模型文件了,格式为.mat
六.导入滤波器并得出传递系数
load('E:\lowpass.mat'); //导入滤波器
[b,a]=tf(Hd); //得出传递系数
这里load函数为导入文件,单引号中写滤波器模型文件的位置,注意加上后缀,而且路径中不要有中文。
七.进行滤波
x=filter(b,a,MU);
这一步直接写即可,无需过多解释
八.画出滤波后信号的时域、频域图
这一步与画原始信号的时域频域图大同小异,无非是把MU换成了x,下面直接放代码。
##时域图
plot(x); //画出滤波后音频的时域图
title('滤波后信号的波形'); //设置标题
xlabel('时间'); //设置X轴单位
ylabel('幅度'); //设置Y轴单位
grid on //添加网格线
##频域图
n=length(x); //计算滤波后音频数据长度
X1=fft(x,n); //对滤波后音频进行傅里叶变化
len = round((length(X1))/2); //选取一半长度
plot(abs(X1(1:len))); //画出滤波后音频的频谱图
title('滤波后信号的频谱'); //设置标题
xlabel('频率'); //设置X轴
ylabel('幅度'); //设置Y轴
grid on //添加网格线
九.画滤波图像
这一步在构建滤波器的时候上面就已经显示了,但是为了方便直接看,就加了这一步。
fvtool(Hd,'Analysis','magestimate');
这也是MATLAB自带的功能,里面的三个参数,第一个是要画的参数,后面两个是X轴和Y轴的名称。
十.导出滤波后的音频文件
audiowrite('newpiano.wav',x,fs);
单引号中为文件名,自己取即可,注意加后缀。
##以上就是全部的过程,后续会上传全部源码及文件
##不足之处请及时指出,互相学习