我有一些FFT數據,257維,每10毫秒,121幀,即1.21秒。我想第一維可能是別的,剩下的就是FFT係數。 這可能只是譜圖數據。根據關於FFT數據的評論,sqrt10和平均方差標準化可能已應用於此。轉換FFT到PCM
從那裏,我想計算回一些44.1赫茲的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。
鑑於您正在討論實現(而不是理論),並且在下面的評論中提到了庫,您應該使用您打算使用的語言來標記此問題... –
@OliverCharlesworth:這是關於兩者,或者甚至更多關於這個理論。我猜想這個實現是微不足道的。但某些語言的具體例子對幫助理解理論很有幫助。也許C++與FFTW?我跳過了FFTW文檔,但我無法理解所有的術語和背景,例如[這裏](http://www.fftw.org/fftw3_doc/One_002dDimensional-DFTs-of-Real-Data.html#One_002dDimensional-DFTs-of-Real-Data)。爲什麼從複雜到現實或其他方式,我只想要真實。 REDFT是什麼?什麼是DCT,DFT,DST?等 – Albert
如果問題是關於理論的話,那麼http://dsp.stackexchange.com可能是您最好的選擇。 –