音频处理 - Num Chunking&前向傅里叶变换?

时间:2012-11-30 19:08:31

标签: java audio fft processing

我无法理解老师教给我的一个概念,并且在同学之间得到了相当不一致的答案。我想知道是否有人可以帮助澄清这个想法或概念?

在音频处理中称为num chunking。 我们只需要处理WAV文件。所以我们假设我们的音频数据是未压缩的。

numChunking与音频正弦波上的傅立叶变换有关。

要确定numChunks的数量,我们会执行类似

的操作

方法1:

int numChunks = totalNumOfSamples/chunkSize

但我与之谈过的其他人也曾说过

方法2:

int numChunks = totalNumOfSamples/binSize

不同之处在于 chunkSize 只是指定的一些数字或者像1024或2000之类的硬编码。另一方面, binSize 是我们对样本应用傅立叶变换后绘制的频率数。我们通常绘制的箱子数量(我们面板上的条形/频率条)大约是50-100,不再显示在屏幕上,它只需要永远。

在方法1中,我们从例如47988个样本/ 2000 = 23个numChunks中获得了许多numchunks。然后我们将这些块发送到for循环并将声音数据的每个样本添加到每个块中,因此,如果我们将所有23个numChunk放在一起,我们几乎拥有整个声音数据而由于存在而导致精度损失无法容纳来自分部的每个样本。然后我们将它们添加到数组或ArrayList中,以便稍后发送到离散傅里叶变换(前向傅里叶函数),我们得到结果并将它们放在我们的箱子中并绘制/绘制结果为条形。

我不确定的最后一个细节是,傅里叶变换是在整个声音中除以TOTAL样本还是在numChunk中除以TOTAL样本数。

在方法2中,这个方法的工作方式是numChunks = total samples / binSize,例如我们将使用相同的示例。 47988 / 30bins = 1599 numChunks。 在这个想法中,我的同学向我解释说numChunks是一些subArrays。所以我制作了一个2D数组,1599个数组,每个数组的长度为binSize,所以当我们通过正向傅立叶变换处理每个subArray时,得到我们得到的幅度值或频率然后我们运行每个subArray通过前向傅立叶除以值通过整个声音的TOTAL样本大小。

两种观点的结果都是不同的。方法1对于第一个值产生大约37.5并且方法2产生3689作为值。它们的下列值通常都是正确的,所以我不确定哪种方法是正确的,或者根本没有正确的方法。

这是用Java编码的

这个问题很令人困惑,因为你可以说我自己很困惑。我希望有人可以帮助澄清哪些是正确的或不正确的,或者解释这个概念。

1 个答案:

答案 0 :(得分:1)

哇,你有点困惑。我会尽力帮助解释一下。

您使用DFT(离散傅立叶变换)进行的操作是采用多个样本N并将它们从时域转换到频域。您在频域中获得的数组大小与您在时域中放入的数组大小相同。因此,您可以根据输出数组中所需的频率分辨率将numChunks设置为您想要的任何值,因为频率分辨率将为sampleRate / numChunks。因此,如果你想要,比如80个频率值,请使用80的块大小。将你的声音文件分成totalNumSamples / 80块,你将依次获得每个块的频率内容。

要回答你的另一个问题,整个声音中的样本总数无关紧要 - 你做的每个DFT完全独立,所以重要的是你在每个DFT中放入的样本数。

我希望这有点帮助。