У меня есть некоторые данные БПФ, 257 измерений, каждые 10 мс, с 121 фреймом, т. Е. 1,21 сек. Я думаю, что первое измерение, вероятно, что-то еще, а остальные коэффициенты FFT, я думаю. Вероятно, это всего лишь данные спектрограммы. Из комментария о данных БПФ может быть применен sqrt10 и нормализация среднего значения.Преобразование FFT в PCM
Оттуда, я хочу рассчитать некоторый сигнал PCM для 44,1 Гц, чтобы я мог воспроизводить звук. Я спросил same question in a more mathematical way here, но, возможно, StackOverflow - лучшее место, потому что я действительно хочу это реализовать. Я также задал тот же вопрос о теории here on DSP SE.
Как мне это сделать? Может быть, мне нужна дополнительная информация (которую я должен как-то выяснить) - что? Может быть, эту недостающую информацию можно разумно угадать?
Этот вопрос касается теории и практической реализации. Я предполагаю, что реализация тривиальна. Но конкретный пример на каком-то языке был бы хорош, чтобы помочь понять теорию. Может быть, C++ с FFTW? Я пропустил документы FFTW, но я не понимаю всей терминологии и некоторого фона, например. here. Почему это от сложного к реальному или по-другому, я только хочу реального. Что такое REDFT? Что такое DCT, DFT, DST? FFTW_HC2R?
Я прочитал все данные БПФ, т. Е. 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 - это, вероятно, ваш лучший выбор. –