huban 发表于 2007-6-29 10:23

求助:怎样对声音信号进行滤波

我现在做一个研究,需要对录入的人声做低通滤波,保留3000hz以下的频率
用matlab怎么弄?我是matlab菜鸟,各位能不能详细解答一下?

zhlong 发表于 2007-6-29 10:29

回复 #1 huban 的帖子

可以先看看本版有关滤波的帖子

wy558558558 发表于 2007-6-29 11:40

建议你可以试一下小波包方法.看了一篇文章不错,名字好象是<基于小波包分析的声信号能量特征提取方法>.

huban 发表于 2007-6-29 16:05

什么叫小波包?

zhlong 发表于 2007-6-29 16:08

回复 #4 huban 的帖子

这个三言两语很难说清楚,楼主可以先看看小波方面的资料。

huban 发表于 2007-6-29 18:25

好吧,我问个很简单的问题:
我的人声录音文件的采样频率是44100,怎样用fft得到其频率图?
我看了书上的示例,大概是这样:
y=fft(x,512);
>> pyy=y.*conj(y)/512;
>> f=1000*(0:256)/512;
>> plot(f,pyy(1:257))
我用这个试了下,得到的图好象不对啊?

huban 发表于 2007-6-29 19:19

再弱问个问题:进行fft之后就可以得到波形的频率信息,那么还有必要进行低通滤波吗?比如我想过滤掉3000hz以上的频率,那么直接在fft转换后的那张频率图中看0到3000的部分不就可以了吗?为什么还要搞低通滤波呢?

wy558558558 发表于 2007-6-29 19:43

这么高的采样频率你用这么少的采样点当然效果不好了.:@L 增大采样点数,提高频率分辨率试试.:@(

zhlong 发表于 2007-6-29 19:58

本帖最后由 wdhd 于 2016-9-7 15:42 编辑

原帖由 huban 于 2007-6-29 18:25 发表
好吧,我问个很简单的问题:
我的人声录音文件的采样频率是44100,怎样用fft得到其频率图?
我看了书上的示例,大概是这样:
y=fft(x,512);
>> pyy=y.*conj(y)/512;
>> f=1000*(0:256)/512;
>> plot(f,pyy(1:2 ...
1000应该换成你的采样频率44100

zhlong 发表于 2007-6-29 20:00

本帖最后由 wdhd 于 2016-9-7 15:42 编辑

原帖由 huban 于 2007-6-29 18:25 发表
好吧,我问个很简单的问题:
我的人声录音文件的采样频率是44100,怎样用fft得到其频率图?
我看了书上的示例,大概是这样:
y=fft(x,512);
>> pyy=y.*conj(y)/512;
>> f=1000*(0:256)/512;
>> plot(f,pyy(1:2 ...
原帖由 wy558558558 于 2007-6-29 19:43 发表
这么高的采样频率你用这么少的采样点当然效果不好了.:@L 增大采样点数,提高频率分辨率试试.:@(
楼主还要注意wy558558558的意见。

jyliao 发表于 2007-7-1 08:03

my approach

1. Use Matab'fdatool' command
2. Select 'Lowpass', 'EquiRippe'
3. Filter order = 'Minimum'
4. Fs =44100, Fpass =3000, Fstop = 4500
6. Unit = 'dB', Apass = 1, Astop = 30
7. Press ' Design Filter' Button, then you got it
8. File\ExportExport to 'Workspace' , Export as 'Coefficients',Name Numerator as 'ftest'
9. Go back to Matlab command window, and check the worksapce, you got a variable named 'ftest'
10. Suppose your data name = x
11. y = filter(x,ftest,1);% this is the filtered data you need

songzy41 发表于 2007-7-1 09:35

本帖最后由 wdhd 于 2016-9-7 15:42 编辑

原帖由 huban 于 2007-6-29 18:25 发表
好吧,我问个很简单的问题:
我的人声录音文件的采样频率是44100,怎样用fft得到其频率图?
我看了书上的示例,大概是这样:
y=fft(x,512);
>> pyy=y.*conj(y)/512;
>> f=1000*(0:256)/512;
>> plot(f,pyy(1:2 ...
完全同意wy558558558和zhlong的意见。采样频率是44100,一个语音少说也要100ms,即有4410个样点,所以用512点做语音分析太短了一些。同时在一个语音中音调往往有变化,共振峰也会有变化,所以对语音分析最好用STFT方法。

再弱问个问题:进行fft之后就可以得到波形的频率信息,那么还有必要进行低通滤波吗?比如我想过滤掉3000hz以上的频率,那么直接在fft转换后的那张频率图中看0到3000的部分不就可以了吗?为什么还要搞低通滤波呢?

这完全取决楼主是否作进一步的处理。如果进一步在频率域上处理,这可以只对0到3000的部分作处理;如果谱分析后还要在时间域上处理,又要去除3000以上的分量,则还需进行低通滤波(不论用频域或时域的方法)。

zhlong 发表于 2007-7-1 13:56

回复 #12 songzy41 的帖子

songzy41 老师,我想楼主是不是想问“直接对频谱上的0~3000HZ部分做IFFT得到的时域信号,和利用通频带为0~3000HZ的低通滤波器得到的时域信号,这两者有什么区别?”。

[ 本帖最后由 zhlong 于 2007-7-1 15:26 编辑 ]

songzy41 发表于 2007-7-1 17:37

本帖最后由 wdhd 于 2016-9-7 15:42 编辑

原帖由 zhlong 于 2007-7-1 13:56 发表
直接对频谱上的0~3000HZ部分做IFFT得到的时域信号,和利用通频带为0~3000HZ的低通滤波器得到的时域信号,这两者有什么区别?
直接对频谱上的0~3000HZ部分做IFFT得到的时域信号,相当于时频域上加了一个矩形窗,将产生吉布斯(Gibbs)现象(同矩形窗加在时域上一样,在频域中产生泄漏);而不论在通过低通滤波器就不会产生这种情况。

longlongyxy 发表于 2007-9-8 17:48

回复 #6 huban 的帖子

应该是Pyy=2*sqrt(y.*conj(y))/512
页: [1]
查看完整版本: 求助:怎样对声音信号进行滤波