2011-02-24 12 views
3

您好 我探索WP7平台和第一蹒跚我已经试图实现使用的库利 - 图基方法的FFT的音频可能性。其结果是,频谱图按此顺序显示4个相同的图像:一个正常,一个反转,一个正常,一个反转。 代码来自另一个C#项目(用于桌面),实现和所有变量似乎与算法一致。因此,我可以立即看到两个问题:降低分辨率和浪费CPU以生成四个相同的光谱图。 鉴于1600的样本量(可能是2048),我知道只有512个可用的频率信息,使我在8kHz频率范围内具有15Hz的分辨率。不错,但也不太好。FFT WP7上显示两个镜子

我应该放弃代码并使用NAudio吗?我似乎没有解释为什么频谱是四倍的,输入数据是好的,算法似乎没问题。

+0

你想对我们看不到的算法/实现发表评论吗? – 2011-02-24 10:08:38

+0

我认为这是标准。无论如何:http://www.codeproject.com/KB/audio-video/FftGuitarTuner.aspx – brainwash 2011-02-24 13:49:44

+0

也许我没有很好地解释这个问题。想象一下,输入的2048个采样被转换成2048个频率振幅(适当位置)。现在让我们假设我有一个共同的50Hz峰值出现在零位附近。这是非常正常的,但我也在1024位置和2048位置附近获得了相同的峰值。我知道FFT谱以零为中心,但我的是同样以一半输入大小位置和全长位置为中心。这意味着在这些经转换的2048个样本中,我得到4个频谱(2个“正常”,2个反射)。我想不出为什么会发生这种情况。 – brainwash 2011-02-24 15:36:37

回答

0

我切换到NAudio,现在FFT工作。不过,我可能已经找到了原因(我可能不会再次尝试测试):当我构建的双数组送入FFT功能,我不喜欢的东西:

  for (int i = 0; i < buffer.Length; i+= sizeof(short)) 
      { 
       samples[i] = ReadSample(buffer, i); 
      } 

作为参考,“样本'是fft的double []输入,ReadSample是一些处理小/大端的东西。现在还不记得代码是怎么回事,但是它正在跳过每一个奇怪的样本。

我的数学知识从来没有伟大的,但我想这引起一些混淆的模式可能在年底之前我经历的影响。

无论如何,问题围绕工作,但感谢你的投入,如果你仍然可以解释我很感激的现象。

+1

我猜它跳过了每一个其他的样本,因为你正在遍历一个'short'数组,并且通过'sizeof(short)'增加索引,这是2.除非'buffer'是一个'byte'数组,在这种情况下你仍然在跳过其他所有字节。 – MusiGenesis 2011-02-26 03:02:46

+0

样本是双[],缓冲区很短[]。我正在通过缓冲区[]正确迭代,但正在填充样本[]每隔一个索引给我留下'洞'。 – brainwash 2011-02-26 11:04:03

+0

什么类型的数组“缓冲区”并不重要 - 你跳过每一个其他元素,因为sizeof(short)'='2'。如果你的代码似乎能够工作,那可能是因为你的原始输入是立体声,所以你最终只在左声道上进行FFT。 – MusiGenesis 2011-03-01 00:58:37

1

这听起来没错。你有两面镜子,我只能假设一面是真实部分,另一面是图像部分。这是标准的FFT。

从实和图像就可以计算各谐波的幅值或幅度这是更常见的或计算每个谐波这是不常见的角度或相移。

吉拉德。

+0

该算法做了幅度计算,输出是一个双镜像(但不正确)的图像。 – brainwash 2011-02-24 13:51:23

+0

下面是复杂的图像转换成一频谱部分: '//计算频谱 双[]谱图=新双[长度]; 对(INT I = 0;我 brainwash 2011-02-24 14:00:03