##MATLAB之时域及频域的乐器信号分析及处理

前言

这是之前使用MATLAB做的一个项目,来对语音信号进行分析处理,设计语音信号的导入及播放操作,读取信号长度、画图及生成滤波等操作,MATLAB小白可零基础上手,只要跟着教程一步一步来就可以,非常简单。

后续会上传源码及文件,请关注并收藏。

设计题目及要求

##设计题目及要求

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);

单引号中为文件名,自己取即可,注意加后缀。

##以上就是全部的过程,后续会上传全部源码及文件
##不足之处请及时指出,互相学习

##文件已上传,自行下载
https://download.csdn.net/download/weixin_44936771/12677957

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐