Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Audio 音频数据FFT:选择哪些数据点?_Audio_Fft_Pcm_Wave - Fatal编程技术网

Audio 音频数据FFT:选择哪些数据点?

Audio 音频数据FFT:选择哪些数据点?,audio,fft,pcm,wave,Audio,Fft,Pcm,Wave,我需要分析16位PCM RIFF WAV格式的长持续时间非周期音频数据。通常,我会以11 kHz或16 kHz的频率获取文件,并以1秒的间隔拍摄快照,以使用FFT准备三维功率谱图 不过,我认为我遗漏了一些非常基本的东西:如果箱子数量有限,那么选择转换哪些数据点以获得最有意义的结果的正确方法是什么 我使用的限制是1024个垃圾箱。因此,在11 kHz时,每个箱子的宽度约为10 Hz,这很好。但是,如何选择要处理的样本?平均每组10个样本,并将其发送至FFT?连续转换10批1024个样本,只需删除最

我需要分析16位PCM RIFF WAV格式的长持续时间非周期音频数据。通常,我会以11 kHz或16 kHz的频率获取文件,并以1秒的间隔拍摄快照,以使用FFT准备三维功率谱图

不过,我认为我遗漏了一些非常基本的东西:如果箱子数量有限,那么选择转换哪些数据点以获得最有意义的结果的正确方法是什么

我使用的限制是1024个垃圾箱。因此,在11 kHz时,每个箱子的宽度约为10 Hz,这很好。但是,如何选择要处理的样本?平均每组10个样本,并将其发送至FFT?连续转换10批1024个样本,只需删除最后几个?任意抽取每秒的前1024个样本

所有这些似乎都不能非常精确地创建一个有效的光谱图谱,我相信一定有一些公认的方法可以解决这类问题,但在环顾四周之后,我还没有找到任何讨论这类问题的方法

编辑-[阅读下面的@fdcpp回复后]

我阅读了短时傅立叶变换[非常有趣!],并修改了我的程序。我仍然在傅里叶输出上得到非常奇怪的值

以下是我所写内容的伪代码:

define N           1024
define SAMPLES     11025
define WINDOWS     10
define SLIPWIDTH   N / 2

        short       audio[0...60 * SAMPLES]
        float       fftvals[0...N/2]
        complex     fftin[N], fftout[N]
        float       hanning[N]
        float       binwidth = SAMPLES / N

for(chunk = 0 to WINDOWS) {
    for(i = 0 to N) {
        fftin[i][real] = ( (float) audio[i + chunk * SLIPWIDTH] / 32768.0 ) * hanning[i];
        fftin[i][imaginary] = 0
    }
    fft(fftin, fftout)
    for(i = 0 to N / 2 + 1) {
        fftvals[i] = sqrt( (fftout[i][real] / binwidth) ^ 2 + (fftout[i][imaginary] / binwidth) ^ 2)
        if (fftvals[i] == 0)
            fftvals[i] = -96
        else
            fftvals[i] = 10 * log10(fftvals[i])
    }

    // add fftvals to totals array here
}
我对16位签名音频数据进行了分析,采样数为11k/秒,每次进入1024个存储箱,每次将窗口滑动½个存储箱。因此,我将对每秒钟音频的前半秒进行采样,通过10组具有宽度为N的滑动窗口的存储箱运行。在将原始音频数据放入FFT输入阵列时,我将使用Hann窗口对其进行平滑处理

我想要的结果是一个标准化分贝值数组,范围从0(最高)到-96(最低)。但正如我所说,我在fftvals[]中得到的值都是胡说八道,所以我做了一些非常错误的事情

我是否需要使用原始音频数据做任何其他操作来准备FFT? 在转换为分贝之前,我对输出值的缩放是否合适?
你注意到我在这里做错了什么吗?

@Cris Luengo我向你道歉。谢谢你的评论!固定的!我想你要找的是(STFT)。因此,您将处理音频帧,而不是整个音频文件。如果您有1024个箱子,那么您必须在一个帧中处理1024个样本。重叠的框架和它们将是该过程的一个重要部分。对样本进行平均是错误的,因为这本质上是低通滤波。平均每个帧的bin大小会更容易接受。