1

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

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

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

为了确定 numChunks 的数量,我们执行类似的操作

方法1:

int numChunks = totalNumOfSamples/chunkSize

但我与之交谈过的其他人也很少说

方法2:

int numChunks = totalNumOfSamples/binSize

不同之处在于chunkSize只是一些指定或硬编码的数字,例如 1024 或 2000 之类的。另一方面, binSize是我们在对样本应用傅里叶变换后绘制的频率数。我们通常绘制的 bin 数量(面板上的条形图/频率条形图)大约是 50-100 个,以便在屏幕上显示,这将永远持续下去。

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

我不确定的最后一个细节是傅立叶变换是否除以整个声音中的 TOTAL 个样本,或者只是 numChunk 中的样本总数。

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

这两种想法的结果是不规则的不同。方法 1 产生的第一个值约为 37.5,方法 2 产生的值为 3689。他们的以下值似乎都是正确的,所以我不确定哪种方法是正确的,或者是否有任何方法是正确的。

这是用Java编码的

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

4

1 回答 1

1

哇,你有点糊涂了。我会尽力帮助解释一下。

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

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

我希望这会有所帮助。

于 2012-12-01T11:07:58.977 回答