将FFT转换为PCM

时间:2015-08-15 18:32:42

标签: fft pcm fftw

我有一些FFT数据,257个维度,每10毫秒,有121帧,即1.21秒。我想第一个维度可能是别的东西,剩下的就是FFT系数。 它可能只是眼镜数据。根据有关FFT数据的评论,可能已在其上应用了sqrt10和均值 - 方差 - 归一化。

从那里开始,我想计算一些44.1 Hz的PCM信号,这样我才能播放声音。我问same question in a more mathematical way here但是StackOverflow可能是一个更好的地方,因为我实际上想要实现它。 我还问了关于理论here on DSP SE的相同问题。

我该怎么做?也许我需要更多的信息(我必须以某种方式找到) - 哪个?也许这些遗漏的信息可以通过某种方式进行智能猜测?

这个问题是关于理论和实际实施的。我猜这个实现是微不足道的。但是,某种语言的具体例子对于理解理论很有帮助。也许C ++与FFTW?我跳过了FFTW文档,但我无法理解所有术语和一些背景知识,例如here。为什么它从复杂到真实或其他方式,我只想要真实到现实。什么是REDFT?什么是DCT,DFT,DST? FFTW_HC2R?

我将所有FFT数据(即121 * 257个浮点数)读入矢量freq_bins

std::vector<float32_t> freq_bins; // FFT data
int freq_bins_count = 257;
size_t len = 121;

std::vector<float32_t> pcm; // output, PCM data

int N = freq_bins_count;
std::vector<double> out(N), orig_in(N);

// inspiration: https://stackoverflow.com/questions/2459295/invertible-stft-and-istft-in-python/6891772#6891772
for(int f = 0; f < len; ++f) {
    size_t pos = freq_bins_count * f;
    for(int i = 0; i < N; ++i)
        out[i] = pow(freq_bins[pos + i] + offset, 10);  // fft was sqrt10 + mvn
    fftw_plan q = fftw_plan_r2r_1d(N, &out[0], &orig_in[0], FFTW_REDFT00, FFTW_ESTIMATE);
    fftw_execute(q);
    fftw_destroy_plan(q);

    // naive overlap-and-add
    auto start_frame = size_t(f * dt * sampleRate);
    for(int i = 0; i < N; ++i) {
        sample_t frame = orig_in[i] * scale / (2 * (N - 1));
        size_t idx = start_frame + i;
        while(idx >= pcm.size())
            pcm.push_back(0);
        pcm[idx] += frame;
    }
}

但我认为这是错误的。我只是把垃圾拿出去了。

相关可能是this question。或this

1 个答案:

答案 0 :(得分:0)

您只需通过逆傅里叶变换推送您拥有的数据。所有FFT库都提供前向和后向转换功能。