Я намагався розробити логіку цього завдання і планую використовувати вихідний пакет KissFFT для виконання швидкої трансформації фур'є. Будь ласка, повідомте мені, якщо це виглядає правильно:
- Виділяють структуру FFT, тобто.
kiss_fft_alloc(N,0,NULL,NULL)
ДеN
розмір вікна, який я використовую. Буфер введення буде масивомN
елементів типуkiss_fft_scalar
. Вихідний буфер буде масивомN/2 + 1
елементів типуkiss_fft_cpx
. - Розшифруйте
N
(розмір вікна) кількість зразків ПКМ. - Для кожного зразка PCM середнє значення амплітуди кожного каналу (непідписані зразки) та масштабу від 0 до 2 (ділиться на 65536,0), зберігаючи результат у вхідному буфері.
- Виконайте віконце (тобто підвішування) на вхідному буфері.
- Виконайте швидке перетворення фур'є на вхідний буфер, зберігаючи у вихідний буфер. Оскільки я використовую реальні значення як вхідні дані, я можу використовувати
kiss_fftr()
. - Для
N/2
вихідних значень отримайте величину перетворених даних у квадраті та перетворіть значення у шкалу dB за такою формулою:10 * log10 (re * re + im * im)
- Накресліть
N/2
значення з кроку 6. - Відкиньте першу половину вхідного буфера, декодуючи наступні (розмір вікна / 2) зразки PCM та виконуючи масштабування та вікно даних. Це повинно ефективно ковзати вікно введення та уникати необхідності повторювати математику на оброблених зразках PCM.
- Переведіть цикл на етап 5, повторюючи ці кроки, поки всі зразки не будуть оброблені.
- Звільніть використану пам'ять від
kiss_fft_alloc()
.
Було запропоновано я відняти значення з вікна введення, перш ніж виконувати FFT, так що отримане значення постійного струму має величину нуля. Чи слід відняти середнє чи середнє значення від вхідних даних?
Крім того, які речі потрібно враховувати, коли я вибираю розмір вікна? Крім того, що воно повинно бути парним числом згідно інструкцій KissFFT, чи є користь від використання невеликого розміру вікна, тобто. чи забезпечить це кращий графік? Я припускаю, що великий розмір вікна зменшує кількість FFT, які необхідно виконати, чи єдина користь від використання великого розміру вікна?
Нарешті, коли я доходжу до того, що дані готові до побудови, як я можу зробити це? Коли в минулому я працював над деякою логікою графіка сигналу, я просто побудував 3 значення для кожного пікселя вздовж осі (мінімальна амплітуда, максимальна амплітуда, амплітуда RMS), але я не знаю, що я повинен робити дані спектрограми.
Заздалегідь дякую за будь-які рекомендації, які ви можете надати.