声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5717|回复: 25

[FFT] 关于音频除噪声 fft

[复制链接]
发表于 2008-9-8 12:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

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

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

音频是8位单声道,采样频率 22kHz的pcm 文件。
回复
分享到:

使用道具 举报

发表于 2008-9-8 14:04 | 显示全部楼层
一般fft变换后,按数组的序列,前面的是低频,后面的是高频。
 楼主| 发表于 2008-9-8 14:15 | 显示全部楼层
我需要具体确定变换之后的数组里的数据对应的频率阿,人的声音频率在300-3600,我想滤除这段频率以外的声音
发表于 2008-9-9 08:28 | 显示全部楼层
变换后的数组,要确定数据点的频率,分辨带宽乘上数据序列号就是该数据的频率。

采样频率:Δf=2/N/T
数据频率:f=i*Δf
发表于 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后用重叠相加(或重叠存储)方法来解决。
发表于 2008-9-9 15:04 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-8 16:05 编辑
原帖由 songzy41 于 2008-9-9 09:08 发表

楼主做了FFT,又做了IFFT,所以“我需要具体确定变换之后的数组里的数据对应的频率”,是指哪一个变换后的数据对应的频率?是不是应该指FFT后?
对于一段1024长的数据,在FFT后可按wanyeqing2003提出的计算谱线的 ...

麻烦宋老师讲解一下重叠相加的思路吧,以前没有听说过,多谢
发表于 2008-9-9 16:17 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-8 16:05 编辑
原帖由 antonylau 于 2008-9-9 15:04 发表


麻烦宋老师讲解一下重叠相加的思路吧,以前没有听说过,多谢

重叠相加和重叠存储法都不是简单几句话能说得清的,但可参看一下奥本海姆的“数字信号处理”,其中笫3.8节中介绍了这两个概念。
 楼主| 发表于 2008-9-9 17:16 | 显示全部楼层

回复 5楼 songzy41 的帖子

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

我把音频序列做完fft之后按wanyeqing2003 的方法确定了普线,把不要的数据 实部和虚部都置0 了,可是再做ifft的时候 结果有复数了,此时我该如何存储呢,只存储实部吗??
发表于 2008-9-9 20:31 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-8 16:05 编辑
原帖由 shida 于 2008-9-9 17:16 发表
谢谢 宋老师,还有一个问题

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

这里要注意的是
1,在正负频率范围内的谱线都要做处理,处理后的频谱一样是共轭对称的;
2,在IFFT后仍为复数,但只取实数部分。
 楼主| 发表于 2008-9-10 09:45 | 显示全部楼层

回复 9楼 songzy41 的帖子

您说的正负频率,拿1024点来说的话, 就是指同时处理 第1点和第512点 是吗?
发表于 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对应的是负频率。
发表于 2008-9-10 12:08 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-8 16:06 编辑
原帖由 songzy41 于 2008-9-9 16:17 发表

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

好的 看来以前不学信号 对很多东西理解都不行
发表于 2008-9-10 14:12 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-8 16:06 编辑
原帖由 shida 于 2008-9-10 09:45 发表
您说的正负频率,拿1024点来说的话, 就是指同时处理 第1点和第512点 是吗?

其实上面所说正负频率,我想应该是双边谱和单边谱的概念。
具体内容请看有关数据分析的书籍。
 楼主| 发表于 2008-9-10 18:50 | 显示全部楼层
fft.doc (35.5 KB, 下载次数: 54) 谢谢宋老师和wanyeqing的帮助,代码现在已经写完。
附件内:
滤波 源代码。


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

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

[ 本帖最后由 shida 于 2008-9-10 18:52 编辑 ]
发表于 2008-9-10 20:53 | 显示全部楼层
个人认为滤波不能完全置零。因为:
1、实际信号存在噪声,不可能全部为零;
2、信号分析不是理想情况,由于有数据截断,即使是单频信号,fft分析后,在音频以外的频率也不会为零。
3、如果你强制某些频率分量为零,那么就可能造成数据的偏差。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-1 14:02 , Processed in 0.103557 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表