|||
Matlab处理wav文件总结
利用专门的音频处理软件,比如CoolEdit、Spectralab等,可以方便的录制声音、分析频谱。这种方式也无需复杂的操作或者专业知识,就可以实时的观察结果。利用这些软件在平时实验数据的测量和分析中,足够用了;但是这些软件处理的数据精细程度往往不够,无法应用于论文中。这种情况下,就需要把录制的音频文件导入到matlab中做后续处理。
下面对这个处理过程做简要的总结。基本思路是用CooEdit采集一组声音,然后用matlab批处理,显示采集信号的频谱曲线。下面即是处理的详细步骤和关键代码。
1、用CooEdit录制声音,可以选择采样率为96kHz,单声道。录制声音长度约为10s,然后存储文件为Windows PCM wav文件格式。文件名最好包括进入测试条件。测试多组数据,将其保存在同一个文件夹中,便于matlab后期的批处理。
2、使用matlab读取一个文件夹里的所有wav文件。在下面的操作中,把sqrt0目录下的所有wav文件名读取到fnames中了。
dirs=dir('sqrt0/*.wav'); % 读取当前目录下所有的excel文件
dircell=struct2cell(dirs)' ; % 结构体(struct)转换成元胞类型(cell),转置一下是让文件名按列排列。
fnames=dircell(:,1); % 第一A列是文件名
3、通过wavread函数读取wav文件数据,并将其存储在Ydata和Fdata中。
fnumber=size(fnames,1); % 求取表格行数,即文件个数
for N=1:1:fnumber
filename=char(fnames(N,1)); % 将cell转换为string
filename=strcat(path,filename); % 校正文件路径
[Y,Fs]=wavread(filename,Num); % 读取当前文件前65536个点
Ydata(N,:) = Y; % 记录数据
Fdata(N,:) = Fs; % 记录采样率
end
4、对数据做FFT运算,并绘制其频谱图。
for N=1:1:fnumber
yy = fft(Ydata(N,:),Num); % 对数据做Num点FFT运算
Yfft(N,:) = 20*log10(abs(yy)); % 对计算结果取模
figure;
ff = linspace(0,Fdata(N),Num); % 在0-采样率之间取Num个频率点
plot(ff,Yfft(N,:),'r'); % 绘制频谱
grid on;
axis([400 3000 -20 70]);
end
5、调整修饰绘图,并存储。下面是用到的一些命令。
set(gcf,'Position',[200 200 350 250]); % 设置绘图的大小
tt = strcat(Freq(N,:),',',Sqrt(N,:),',',Modindex(N,:));
title(tt); % 设置绘图标题
legend('m=1.0');
xlabel('Frequency(Hz)','FontSize',14,'FontName','Times New Roman');% 设置x坐标轴标注字体
ylabel('Amplitude(dB)','FontSize',14,'FontName','Times New Roman');
Note = strcat('m=',Modindex(N,:));
text(1800,55,Note,'FontSize',14); % 在400,300位置添加标注
set(gca,'FontSize',12); % 设置坐标轴字体
set(gcf,'visible','off'); % 不显示图片
tt = strcat(Freq(N,:),'_',Sqrt(N,:),'_',Modindex(N,:),'.emf');
saveas(gcf,tt,'emf'); % 存储绘图为eps格式
6、将生成的图片,导入到excel中。因为excel不能识别eps图片,所以生成emf图片。两种格式都是矢量图,放大缩小不会失真。可以调出excel工具栏的图片工具,第一个工具即为插入快捷键。这样会更方便快捷。