我有一些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。
答案 0 :(得分:0)
您只需通过逆傅里叶变换推送您拥有的数据。所有FFT库都提供前向和后向转换功能。