问题描述:
在MATLAB中
用以下代码可以发出一个拨号声,
n = 1 : 999
d5(n) = sin(0.5906n) + sin(1.0245n)
sound(d5, 8192)
但如果我想把一个声音输出为了一个WAVE文件的话,应该怎么做,请高手指点
解析:
for n = 1 : 999
d5(n) = sin(0.5906*n) + sin(1.0245*n)
end
sound(d5, 8192)
d6=d5/2%avoid to be clipped
wavwrite(d6,8192,16,'d5.wav')
1)用mp3录音,生成文件cricket.wav,把该文件放到matlab文件夹里面(就是你打开matlab后中间顶部的地址)。
2)使用如下程序,做波形显示以及fft变换。
[y,Fs,bits]=wavread('cricket.wav')%读出信号,采样率和采样位数。
y=y(:,1)%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)
sigLength=length(y)
Y = fft(y,sigLength)
Pyy = Y.* conj(Y) / sigLength
halflength=floor(sigLength/2)
f=Fs*(0:halflength)/sigLength
figureplot(f,Pyy(1:halflength+1))xlabel('Frequency(Hz)')
t=(0:sigLength-1)/Fs
figureplot(t,y)xlabel('Time(s)')
3)频率看频谱就有了,声音间隔看声音波形,周期看声音波形。
4)关于去噪声。
a)如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
b)如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到对噪声的采样、计算特征值以及决定阶数的问题。
c)幸好我们可以“耍赖”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
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工具栏的图片工具,第一个工具即为插入快捷键。这样会更方便快捷。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)