如何对wav文件使用FFT进行频谱分析?

teleinfor 2012-03-03 06:26:58
加精
需要对一个wav文件做频谱分析,都忘记FFT到底是干啥的了。
请问如何分析一个wav文件的频谱呢?FFT的采样点数如何确定?
wav文件为PCM音频,采样频率为8000/s
...全文
9635 82 打赏 收藏 转发到动态 举报
写回复
用AI写文章
82 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaosunqiong 2014-03-07
  • 打赏
  • 举报
回复
楼主弄懂怎样从PCM数据中分析出频谱图没?我也想了解一下?
hannylove24 2012-08-19
  • 打赏
  • 举报
回复
现在发现、如果以前老师不是按课本死教、学信号处理也不会这么累、而且搞不懂所以然,纯理论站在虚的角度研究一个虚的东西,但是要是结合一个音频分析、保准懂得又快又好
hannylove24 2012-08-19
  • 打赏
  • 举报
回复
和楼主一样,fft算法我自己已经写了,频域数据反变换能够变回原来的时域数据,因为做到频域离散傅里叶变换是以k(整数0~N)为变量带入和连续的傅里叶变换不同,不是一个具体的频率值,而且代入多少时域点就有多少频域点,那现在我知道wave格式的音频的采样率,如果只有k,把k代到频谱函数求出来的值就是把k*音频的采样率就得到实际的频率上的频谱了吗?
danxger 2012-07-12
  • 打赏
  • 举报
回复
现在发现还是外文翻译过来的书好,通俗易懂,这样的书才是好书
ddjdl 2012-07-12
  • 打赏
  • 举报
回复
时间过的好快,跟进频谱分析
danxger 2012-04-21
  • 打赏
  • 举报
回复
没有人关注了,顶一下!
danxger 2012-04-21
  • 打赏
  • 举报
回复
顶一下吧。都没有人关注了
hztj2005 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 的回复:]
audacity是开源的音频处理软件,他不光可以分析频谱,还有音频处理算法,如降噪等。
你可以把他编译出来自己分析源码,不过编译的过程有点麻烦,我也花了点时间才编译好。
[/Quote]

我也找到这里了,看来这个不但编译有点麻烦,而且结构也够复杂的,要点时间来理清流程。
hztj2005 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 71 楼 danxger 的回复:]
引用 70 楼 hztj2005 的回复:
虽然对于一般编程来说,不了解蝶形算法,直接运用现有的FFT代码也是可以的。
但总觉得不踏实,
看了很多本书,
觉得高西全的《数字信号处理》第4章把FFT的蝶形算法的步骤讲得最透。
所以这个书能印35万册也是有理由的。

有没有电子档的,能发一份给我吗?
[/Quote]

没有,我买的纸质,29元。
danxger 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 72 楼 hztj2005 的回复:]
引用 71 楼 danxger 的回复:
引用 70 楼 hztj2005 的回复:
虽然对于一般编程来说,不了解蝶形算法,直接运用现有的FFT代码也是可以的。
但总觉得不踏实,
看了很多本书,
觉得高西全的《数字信号处理》第4章把FFT的蝶形算法的步骤讲得最透。
所以这个书能印35万册也是有理由的。

有没有电子档的,能发一份给我吗?


没有,我买的纸质,29元。
[/Quote]
那我也买一本吧。以前买过清华出版的音频信号处理,还有赵力的信号处理,看了一些,没看懂!有问题希望大侠指点啊!
hztj2005 2012-03-26
  • 打赏
  • 举报
回复
虽然对于一般编程来说,不了解蝶形算法,直接运用现有的FFT代码也是可以的。
但总觉得不踏实,
看了很多本书,
觉得高西全的《数字信号处理》第4章把FFT的蝶形算法的步骤讲得最透。
所以这个书能印35万册也是有理由的。

danxger 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 hztj2005 的回复:]
虽然对于一般编程来说,不了解蝶形算法,直接运用现有的FFT代码也是可以的。
但总觉得不踏实,
看了很多本书,
觉得高西全的《数字信号处理》第4章把FFT的蝶形算法的步骤讲得最透。
所以这个书能印35万册也是有理由的。
[/Quote]
有没有电子档的,能发一份给我吗?
danxger 2012-03-21
  • 打赏
  • 举报
回复
学计算机的,没有学过信号处理,现在恶补信号处理啊!!!
hztj2005 2012-03-19
  • 打赏
  • 举报
回复
谢谢syrchina 的回复:
另外推荐一篇文章:
http://apps.hi.baidu.com/share/detail/22378128


与63楼做一个对比,我改用512的频率采样,采2秒,就是1024个数据,按1024进行FFT,

结果有比例的变化:

C/C++ code
//产生模拟原始数据输入 ,在实际应用时替换为AD采样数据
void InputData(void)
{
int i;
for(i=0; i<(N_FFT/2); i++)//制造输入序列
{
data_of_N_FFT[i].real = sin((2*PI/(N_FFT/2))*i)+5*sin((2*PI/(N_FFT/2))*20*i);//输入采样数据
data_of_N_FFT[i].imag = 0;
data_of_N_FFT[i+512].real = sin((2*PI/(N_FFT/2))*i)+5*sin((2*PI/(N_FFT/2))*20*i);//输入采样数据
data_of_N_FFT[i+512].imag = 0;
}
}



0,0.00000
1,0.00000
2,512.00000
3,0.00000
4,0.00001
.........
37,0.00000
38,0.00000
39,0.00000
40,2560.00000
41,0.00000
42,0.00000
...........
982,0.00000
983,0.00000
984,2560.00000
985,0.00000
986,0.00000
987,0.00000
...........
1019,0.00000
1020,0.00001
1021,0.00000
1022,512.00000
1023,0.00000

2和40都要除2秒,才是正确的结果。

我这样试验是有这样一个疑问:

一般说话4-6个音节/秒,但有快有慢,按22.05kHz采样,一个音节就是55125-36750采样点,

对于一个系列的语音采样,无法准确确定某个音节的起点和终点,

那么一次FFT函数的样本数多少如何影响频谱分析的结果?

danxger 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 syrchina 的回复:]
另外推荐一篇文章:
http://apps.hi.baidu.com/share/detail/22378128
[/Quote]
这篇文章不错!
rickys2080 2012-03-17
  • 打赏
  • 举报
回复
另外推荐一篇文章:
http://apps.hi.baidu.com/share/detail/22378128
rickys2080 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 hztj2005 的回复:]

引用 57 楼 syrchina 的回复:
FFT示例代码:
http://blog.csdn.net/syrchina/article/details/6670517


我用你代码模拟原始数据输入y=sin(x)+5*sin(20x)
void InputData(void)
{
int i;
for(i=0; i<N_FFT; i++)//制造输入序列
{
data……
[/Quote]
除以N(即FFT点数),原因参看:
http://www.baidu.com/s?tn=monline_dg&bs=FFT+%BD%E1%B9%FB+%B3%FD%D2%D4&f=8&rsv_bp=1&wd=FFT+%BD%E1%B9%FB+%B3%FD%D2%D4N&inputT=395
vc_dreamver 2012-03-17
  • 打赏
  • 举报
回复
http://www.fftw.org/正解! 一维二维都可以,还可以变长!
hztj2005 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 syrchina 的回复:]
FFT示例代码:
http://blog.csdn.net/syrchina/article/details/6670517
[/Quote]

我用你代码模拟原始数据输入y=sin(x)+5*sin(20x)
void InputData(void)
{
int i;
for(i=0; i<N_FFT; i++)//制造输入序列
{
data_of_N_FFT[i].real = sin((2*PI/N_FFT)*i)+5*sin((2*PI/N_FFT)*20*i); //输入采样数据
data_of_N_FFT[i].imag = 0;
}
}

FFT后
sqrt(data_of_N_FFT[i].real*data_of_N_FFT[i].real+data_of_N_FFT[i].imag*data_of_N_FFT[i].imag)
的数据:
0,0.00000
1,512.00000
2,0.00000
3,0.00000
........
18,0.00000
19,0.00000
20,2560.00000
21,0.00000
22,0.00000
........
1002,0.00000
1003,0.00000
1004,2560.00000 //为什么有???
1005,0.00000
1006,0.00000
........
1020,0.00001
1021,0.00000
1022,0.00000
1023,512.00000 //为什么有??

这个结果正确吗?
正式取值似乎还要除512?
danxger 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 hztj2005 的回复:]
引用 54 楼 danxger 的回复:

我的帖子没有说解决了采样问题啊!!


我记错了。

我在网上找了采样画波形的代码,整合到了一起。

试用几天如果没错,就传到网上。

但fft还没弄懂。
[/Quote]
你的采样画波代码试用好了么?
FFT不容易懂啊!!!
加载更多回复(50)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧