2015-08-15 7 views
1

У меня есть некоторые данные БПФ, 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.

+0

Учитывая, что вы говорите о реализации (а не о теории), а также о упоминании библиотек в комментариях ниже, вы должны пометить этот вопрос языком, который вы собираетесь использовать ... –

+0

@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

+0

Если вопрос о теории, то http://dsp.stackexchange.com - это, вероятно, ваш лучший выбор. –

ответ

0

Вы просто проталкиваете эти данные через обратное преобразование Фурье. Все библиотеки FFT предлагают функции прямого и обратного преобразования.

+0

Не могли бы вы дать дополнительную информацию? В настоящее время я не использую такую ​​библиотеку. Какой из них я буду использовать и как именно получить данные PCM? Может быть, вы можете привести пример кода для какой-либо библиотеки? – Albert

2

Если данные, которые вы должны реально то данные у вас есть, скорее всего, spectrogram данных и, если данные, которые вы получаете сложный, то вы, скорее всего, есть сырые short time fourier transform данные (КК) (см диаграмму на this пост в см., как производятся данные STFT/спектрограммы). Данные Spectrogram производятся путем взятия квадрата величин STFT-данных и, таким образом, не обратимы, поскольку все данные фазы в звуковом сигнале были потеряны, но необработанные данные STFT обратимы, поэтому, если это то, что у вас есть, тогда вы можете захотеть найти библиотеку, которая выполняет обратную функцию STFT и пытается ее использовать.

Что касается вопроса о том, что представляют значения FFT в ваших данных, я считаю, что 257 точек данных, которые вы получаете каждые 10 мс, являются результатом использования БПФ с 512 точками в процессе STFT. Первый образец - это 0 Гц частота, а остальные 256 точек данных составляют половину спектра БПФ (другая половина данных БПФ была отброшена, поскольку вход в БПФ является реальным, и поэтому одна половина данных БПФ является просто комплексным сопряжением Другая половина).

В дополнение к этому я хотел бы отметить, что только потому, что вы получаете данные FFT каждые 10 мс 121 раз, это не означает, что аудиосигнал равен 1,21. STFT обычно создается с использованием перекрывающихся окон, поэтому ваш аудиосигнал может быть меньше 1,21 с.

+0

У меня есть только те 257 измерений. Даже если я не могу воспроизвести истинный сигнал, могу ли я каким-то образом воспроизвести некоторый сигнал, который будет генерировать те же данные FFT? – Albert

+0

Проще говоря: если у вас есть необработанные данные STFT (т. Е. Данные частоты у вас есть матрица комплексных чисел, представляющих аудио), вы можете инвертировать данные, чтобы вернуть вам звуковой сигнал, но если у вас есть данные спектрограммы (т.е. данные частоты у вас есть матрица действительных чисел, представляющая данные), то вы не сможете ее инвертировать или даже получить сигнал, который звучит близко к исходному сигналу, потому что вся информация о фазе выбрана. Подробнее о инвертировании STFT см. это: http://eeweb.poly.edu/iselesni/EL713/STFT/stft_inverse.pdf – KillaKem

+0

У меня только эти 257 измерений реальных данных (или, может быть, это 128 сложных + 1 реальных? но они выглядят одинаково, поэтому я предполагаю, что 257 реальный имеет больше смысла). Итак, я думаю, что это спектрограмма (как именно вы получаете это от необработанного STFT? Sqrt (abs (fft)) или так?). Не могу ли я каким-то образом воссоздать некоторые фазовые данные? Если я просто возьму 0 или что-нибудь еще, вернусь ли я к той же спектрограмме? Если нет, могу ли я догадаться о фазовых данных так, чтобы получить ту же самую спектрограмму? Или вы говорите, что два звука с одной и той же спектрограммой могут звучать совершенно иначе? Почему это? Это очень противоречиво для меня. – Albert

 Смежные вопросы

  • Нет связанных вопросов^_^