在matlab中怎样实现对声音的导入,分析与处理???
我要用matlab分析蟋蟀的声音,同时做出其声音几个参数(频率,声音间隔,周期)的图像,在matlab中能实现吗?怎样实现的??还有,我用mp3录下了蟋蟀的叫声,但其中有...
我要用matlab分析蟋蟀的声音,同时做出其声音几个参数(频率,声音间隔,周期)的图像,在matlab中能实现吗?
怎样实现的??
还有,我用mp3录下了蟋蟀的叫声,但其中有些杂音,能去掉吗?重要的是我该怎样导入声音文件?
在matlab中可以改变声音的一些参数进行声音的回放吗?
烦请高手指点!!!不胜感激!!! 展开
怎样实现的??
还有,我用mp3录下了蟋蟀的叫声,但其中有些杂音,能去掉吗?重要的是我该怎样导入声音文件?
在matlab中可以改变声音的一些参数进行声音的回放吗?
烦请高手指点!!!不胜感激!!! 展开
--
2022-12-05 广告
2022-12-05 广告
图形化编程简单理解为用积木块形式编程,scratch和python也是其中的一种,属于入门级编程,以其简单生动的画面获得无数学生的喜爱,深圳市创客火科技有限公司是一家做教育无人机的公司,旗下有编程无人机,积木无人机及室内外编队,每款飞机含有...
点击进入详情页
本回答由--提供
展开全部
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;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y);xlabel('Time(s)');
3)频率看频谱就有了,声音间隔看声音波形,周期看声音波形。
4)关于去噪声。
a)如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
b)如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到对噪声的采样、计算特征值以及决定阶数的问题。
c)幸好我们可以“耍赖”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。
例子:matlab去除50hz噪声。
我用电脑录了一段声音,里面有50hz的周期噪声(因为受交流电干扰)。而我自己的声音频率最低是90hz。我使用了一个10阶butterworth高通滤波器,边带是70hz(介于50跟90之间)。
问题是,这不能直接用。因为声音文件的采样率是22k,70相对于22k来说太小了。所以我得先把我的声音欠采样,然后再滤波,然后再插值。程序如下。
[k,Fs,bits]=wavread('mywav.wav');
k=k(:,1);
y_temp=k(1:90000);
dfactor=3;
y=decimate(y_temp,dfactor);
[b,a] = butter(10,70/(Fs/(dfactor*2)),'high');
y=filter(b,a,y);
y=interp(y,dfactor);
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
sigLength=length(y_temp);
Y = fft(y_temp,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y,t,y_temp);xlabel('Time(s)');
wavplay(y,Fs);
wavplay(y_temp,Fs);
5)回放:使用wavplay函数
wavplay(y,Fs);
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;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y);xlabel('Time(s)');
3)频率看频谱就有了,声音间隔看声音波形,周期看声音波形。
4)关于去噪声。
a)如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
b)如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到对噪声的采样、计算特征值以及决定阶数的问题。
c)幸好我们可以“耍赖”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。
例子:matlab去除50hz噪声。
我用电脑录了一段声音,里面有50hz的周期噪声(因为受交流电干扰)。而我自己的声音频率最低是90hz。我使用了一个10阶butterworth高通滤波器,边带是70hz(介于50跟90之间)。
问题是,这不能直接用。因为声音文件的采样率是22k,70相对于22k来说太小了。所以我得先把我的声音欠采样,然后再滤波,然后再插值。程序如下。
[k,Fs,bits]=wavread('mywav.wav');
k=k(:,1);
y_temp=k(1:90000);
dfactor=3;
y=decimate(y_temp,dfactor);
[b,a] = butter(10,70/(Fs/(dfactor*2)),'high');
y=filter(b,a,y);
y=interp(y,dfactor);
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
sigLength=length(y_temp);
Y = fft(y_temp,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');
t=(0:sigLength-1)/Fs;
figure;plot(t,y,t,y_temp);xlabel('Time(s)');
wavplay(y,Fs);
wavplay(y_temp,Fs);
5)回放:使用wavplay函数
wavplay(y,Fs);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询