shida 发表于 2008-9-8 12:05

关于音频除噪声 fft

本人在写一个消除音频 自然噪音的c程序

计划是这样的:
从音频序列中 依次取出1024个点,做fft变换,然后将频率低于一定值的
fft变换结果 实部置0,再做ifft,恢复时域序列。

问题是:
对这1024个点变换之后,怎么确定哪些点是高频还是低频呢。

音频是8位单声道,采样频率 22kHz的pcm 文件。

wanyeqing2003 发表于 2008-9-8 14:04

一般fft变换后,按数组的序列,前面的是低频,后面的是高频。

shida 发表于 2008-9-8 14:15

我需要具体确定变换之后的数组里的数据对应的频率阿,人的声音频率在300-3600,我想滤除这段频率以外的声音

wanyeqing2003 发表于 2008-9-9 08:28

变换后的数组,要确定数据点的频率,分辨带宽乘上数据序列号就是该数据的频率。

采样频率:Δf=2/N/T
数据频率:f=i*Δf

songzy41 发表于 2008-9-9 09:08

本帖最后由 VibInfo 于 2016-11-8 16:05 编辑

原帖由 shida 于 2008-9-8 14:15 发表
我需要具体确定变换之后的数组里的数据对应的频率阿,人的声音频率在300-3600,我想滤除这段频率以外的声音
楼主做了FFT,又做了IFFT,所以“我需要具体确定变换之后的数组里的数据对应的频率”,是指哪一个变换后的数据对应的频率?是不是应该指FFT后?
对于一段1024长的数据,在FFT后可按wanyeqing2003提出的计算谱线的频率,很容易找出在300-3600之外的谱线编号,然后按楼主一层提出的方法对300-3600之外的谱线(实部和虚部)都置0值,再IFFT便得到滤波后的数据了。
对于语音信号分成多段数据,在处理上就不能象处理一段数据那么简单,有可能IFFT之后在两段连接处产生不连续。这可以在时间域上直接滤波,或在频域滤波中IFFT后用重叠相加(或重叠存储)方法来解决。

antonylau 发表于 2008-9-9 15:04

本帖最后由 VibInfo 于 2016-11-8 16:05 编辑

原帖由 songzy41 于 2008-9-9 09:08 发表

楼主做了FFT,又做了IFFT,所以“我需要具体确定变换之后的数组里的数据对应的频率”,是指哪一个变换后的数据对应的频率?是不是应该指FFT后?
对于一段1024长的数据,在FFT后可按wanyeqing2003提出的计算谱线的 ...
麻烦宋老师讲解一下重叠相加的思路吧,以前没有听说过,多谢

songzy41 发表于 2008-9-9 16:17

本帖最后由 VibInfo 于 2016-11-8 16:05 编辑

原帖由 antonylau 于 2008-9-9 15:04 发表


麻烦宋老师讲解一下重叠相加的思路吧,以前没有听说过,多谢
重叠相加和重叠存储法都不是简单几句话能说得清的,但可参看一下奥本海姆的“数字信号处理”,其中笫3.8节中介绍了这两个概念。

shida 发表于 2008-9-9 17:16

回复 5楼 songzy41 的帖子

谢谢 宋老师,还有一个问题

我把音频序列做完fft之后按wanyeqing2003 的方法确定了普线,把不要的数据 实部和虚部都置0 了,可是再做ifft的时候 结果有复数了,此时我该如何存储呢,只存储实部吗??

songzy41 发表于 2008-9-9 20:31

本帖最后由 VibInfo 于 2016-11-8 16:05 编辑

原帖由 shida 于 2008-9-9 17:16 发表
谢谢 宋老师,还有一个问题

我把音频序列做完fft之后按wanyeqing2003 的方法确定了普线,把不要的数据 实部和虚部都置0 了,可是再做ifft的时候 结果有复数了,此时我该如何存储呢,只存储实部吗??
这里要注意的是
1,在正负频率范围内的谱线都要做处理,处理后的频谱一样是共轭对称的;
2,在IFFT后仍为复数,但只取实数部分。

shida 发表于 2008-9-10 09:45

回复 9楼 songzy41 的帖子

您说的正负频率,拿1024点来说的话, 就是指同时处理 第1点和第512点 是吗?

songzy41 发表于 2008-9-10 10:29

本帖最后由 VibInfo 于 2016-11-8 16:06 编辑

原帖由 shida 于 2008-9-10 09:45 发表
您说的正负频率,拿1024点来说的话, 就是指同时处理 第1点和第512点 是吗?
对于1024点来说,FFT后,笫1-513条谱线对应是正频率(对应的频率0-fs/2),514-1024对应的是负频率。

antonylau 发表于 2008-9-10 12:08

本帖最后由 VibInfo 于 2016-11-8 16:06 编辑

原帖由 songzy41 于 2008-9-9 16:17 发表

重叠相加和重叠存储法都不是简单几句话能说得清的,但可参看一下奥本海姆的“数字信号处理”,其中笫3.8节中介绍了这两个概念。
好的 看来以前不学信号 对很多东西理解都不行

wanyeqing2003 发表于 2008-9-10 14:12

本帖最后由 VibInfo 于 2016-11-8 16:06 编辑

原帖由 shida 于 2008-9-10 09:45 发表
您说的正负频率,拿1024点来说的话, 就是指同时处理 第1点和第512点 是吗?
其实上面所说正负频率,我想应该是双边谱和单边谱的概念。
具体内容请看有关数据分析的书籍。

shida 发表于 2008-9-10 18:50

谢谢宋老师和wanyeqing的帮助,代码现在已经写完。
附件内:
滤波 源代码。


问题:
对 1024点音频序列做完fft之后 ,除了以下位置的点不变外,其余的点实部和虚部都置0:
第1点,第7到95点,第517到605点。
第7到95点 和第517到605点 为人的声音频率所在的点,这比较好理解。
第1点不知道为何不能置0,一旦置0的话 ,ifft之后会出现刺耳的声音。

还请大家再帮忙看看,代码中有不对的地方也请指正。

[ 本帖最后由 shida 于 2008-9-10 18:52 编辑 ]

wanyeqing2003 发表于 2008-9-10 20:53

个人认为滤波不能完全置零。因为:
1、实际信号存在噪声,不可能全部为零;
2、信号分析不是理想情况,由于有数据截断,即使是单频信号,fft分析后,在音频以外的频率也不会为零。
3、如果你强制某些频率分量为零,那么就可能造成数据的偏差。
页: [1] 2
查看完整版本: 关于音频除噪声 fft