У меня есть несколько сигналов, и я смешиваю их, соответственно, получаю больший сигнал, где каждый сигнал расположен в разных частотных областях.
Теперь я выполняю операцию FFT для большого сигнала с помощью FFTW и вырезаю конкретные ячейки FFT (там, где расположены сигналы).
Например. Большой сигнал БПФ преобразован с 1024 точками
частота дискретизации сигнала fs = 200000
Я рассчитываю конкретные позиции бункера для заданных частот начальной остановки следующим образом:
tIndex.iStartPos = (int64_t) ((tFreqs.i64fstart) / (mSampleRate / uFFTLen));
и, например, Я получаю за первый сигнал, который будет вырезан 16 корзин.
Теперь я снова выполняю преобразование ifft с помощью FFTW и возвращаю 16 комплексных значений (потому что я зарезервировал вектор для 16 бинов).
Но когда я сравниваю извлеченный сигнал с исходным малым сигналом в MATLAB, то я вижу, что исходный сигнал (это файл wav) содержит данные xxxxx, а мой сигнал (который я сохранил как необработанный двоичный файл) имеет только 16 комплексных значений. ,
Итак, как мне получить длину операции iFFT для правильного преобразования? Соответственно что тут не так?
РЕДАКТИРОВАТЬ
Сама логика разделена на 3 программы, каждая из которых находится в многопоточном окружении. По этой причине я публикую здесь некоторый псевдокод:
ReadWavFile(); //returns the signal data and the RIFF/FMT header information
CalculateFFT_using_CUFFTW(); //calculates FFT with user given parameters, like FFT length, polyphase factor, and applies polyphased window to reduce leakage effect
GetFFTData(); //copy/get FFT data from CUDA device
SendDataToSignalDetector(); //detects signals and returns center frequency and bandwith for each sigal
Freq2Index(); // calculates positions with the returned data from the signal detector
CutConcreteBins(position);
AddPaddingZeroToConcreteBins(); // adds zeros till next power of 2
ApplyPolyphaseAndWindow(); //appends the signal itself polyphase-factor times and applies polyphased window
PerformIFFT_using_FFTW();
NormalizeFFTData();
Save2BinaryFile();
—> Затем проанализируйте данные в MATLAB (в данный момент в работе)
Если у вас есть реальный сигнал, состоящий из 1024 выборок, вклад из 16 представляющих интерес частотных бинов можно получить, умножив частотный спектр на прямоугольное окно, а затем приняв IFFT. По сути это составляет:
fftw_plan_dft_1d(..., FFTW_BACKWARD,...
для обратного преобразования), вычисляя эрмитову симметрию для верхней половины спектра (или просто используйте представление половинного спектра и выполните обратное преобразование через fftw_plan_dft_c2r_1d
). Тем не менее, вы получите лучшую декомпозицию частоты, используя специально разработанные фильтры, а не просто прямоугольное окно в частотной области.
Выходная длина FT равна входной длине. Я не знаю, как вы попали в 16 корзин; FT из 1024 входов составляет 1024 бина. Теперь для реального ввода (не сложного) 1024 ячейки будут зеркально идентичны около 512/513, поэтому ваша библиотека FFT может возвращать только нижние 512 корзин для реального ввода. Тем не менее, это более 16 корзин.
Вам, вероятно, нужно будет заполнить все 1024 ячейки при выполнении IFFT, поскольку обычно он не предполагает, что его выходной сигнал станет реальным сигналом. Но тогда нужно просто отразить нижние 512 корзин.