Як переутворювати звук за допомогою FFT або DFT


12

Я знижую вибірку голосового аудіо, спочатку виконуючи FFT, потім лише беручи потрібні мені частини результату, а потім виконуючи зворотний FFT. Однак він працює належним чином лише тоді, коли я використовую частоти, що мають потужність дві, скажімо, вибірку з 32768 до 8192. Я виконую FFT на даних 32k, відкидаю верхню 3/4 даних і виконую обернений FFT на решті 1/4.

Однак кожного разу, коли я намагаюся зробити це з даними, які не вибудовуються належним чином, трапляється одна з двох речей: Математична бібліотека, яку я (Aforge.Math) використовує, придатна, тому що мої вибірки не є двома. Якщо я спробую зняти зразки з нульовим накладом, щоб вони стали силою двійки, з іншого боку це вийде. Я також спробував використати DFT замість цього, але він виявляється шалено повільним (це потрібно робити в режимі реального часу).

Як би я перейшов до нульового прокладки даних FFT як на початковому FFT, так і на зворотному FFT в кінці? Якщо припустити, що у мене є вибірка на 44,1 Гц, що потрібно дістатись до 16 кГц, я зараз спробую щось подібне, розмір вибірки - 1000.

  1. Прошийте вхідні дані до 1024 наприкінці
  2. Виконайте FFT
  3. Прочитайте перші 512 елементи в масиві (мені потрібно лише перші 362, але мені потрібно ^ 2)
  4. Виконують зворотний FFT
  5. Прочитайте перші 362 елементи в буфері відтворення аудіо

З цього я отримую сміття в кінці. Зробити те ж саме, але без необхідності прокладати на кроках 1 і 3 через те, що вже є зразки ^ 2, дає правильний результат.

c#  audio 

9
FFT насправді не правильний спосіб зробити це. Ви хочете отримати багатофазний фільтр для максимальної ефективності, але якщо ви просто хочете вирішити проблему, спочатку перейдіть до вибірки до GCD, потім до низької частоти, а потім до нижньої вибірки.
Бйорн Рош

Привіт Бьорн: що таке "GCD"?
SpeedCoder5

Відповіді:


16

Перший крок - переконатися, що і початкова швидкість вибірки, і цільова частота вибірки є раціональними числами . Оскільки вони є цілими числами, вони автоматично є раціональними числами. Якщо один з них не був раціональним числом, все-таки можна було б змінити швидкість вибірки, але це набагато інший процес і складніше.

Наступним кроком є ​​розміщення двох вибіркових норм. Початкова швидкість вибірки в цьому випадку становить 44100, що дорівнює . Цільова частота вибірки, 16000, коефіцієнти до 2 75 3 . Таким чином, для перетворення з початкової швидкості вибірки в цільову швидкість треба зменшити на 3 27 2 та інтерполювати на 2 552232527227533272255 .

Попередні кроки потрібно виконати незалежно від того, як ви хочете переупорядкувати дані. Тепер поговоримо про те, як це зробити з FFT. Трюк у перекомпонуванні з FFT полягає в тому, щоб вибрати довжину FFT, завдяки якій усе гарно вийде. Це означає вибір довжини FFT, яка кратна швидкості децимації (у цьому випадку 441). Для прикладу виберемо FFT довжиною 441, хоча ми могли вибрати 882, 1323 або будь-який інший позитивний кратний 441.

Щоб зрозуміти, як це працює, допомагає візуалізувати це. Ви починаєте з звукового сигналу, який виглядає в частотній області щось на зразок малюнка нижче. Частота вибірки 44,1 кГц

Завершивши обробку, ви хочете знизити частоту вибірки до 16 кГц, але ви хочете якомога менше спотворень. Іншими словами, ви просто хочете зберегти все з наведеного вище зображення від -8 кГц до +8 кГц і скинути все інше. Це призводить до малюнка нижче. введіть тут опис зображення

Зверніть увагу, що вибіркові показники не мають масштабу, вони просто є для ілюстрації понять.

255 ), тому ми зберігаємо 160 зразків, які представляють частоти від -8 кГц до +8 кГц. Потім ми обертаємо FFT ці зразки та presto! У вас є 160 зразків часової області, які відбираються на частоті 16 кГц.

Як ви можете підозрювати, є кілька можливих проблем. Я перегляну кожен і поясню, як ви можете їх подолати.

  1. Що ви робите, якщо ваші дані не є кратним кратним коефіцієнтом децимації? Ви можете легко подолати це, доповнивши кінець своїх даних достатньою нулями, щоб зробити їх кратним коефіцієнту децимації. Дані набиваються перед тим, як це FFT'ed.

  2. лл-1нулі (будь ласка, зверніть увагу, що кількість зразків даних та кількість проб підкладки повинні бути ВІДПОВІДНИМ кратним коефіцієнту децимації; ви можете збільшити довжину оббивки, щоб відповідати цьому обмеженню), FFT ', укладаючи дані, помножуючи частотну область даних та фільтр, а потім псевдонім високої частоти (> 8 кГц) призводить до низькочастотних (<8 кГц) результатів перед тим, як скидати результати високої частоти. На жаль, оскільки фільтрація в частотній області сама по собі є великою темою, я не зможу детальніше описуватись у цій відповіді. Однак я скажу, що якщо ви фільтруєте та обробляєте дані більш ніж однією частиною, вам потрібно буде реалізувати Overlap-and-Add або Overlap-and-Save, щоб фільтрування було безперервним.

Я сподіваюся, що це допомагає.

EDIT: Різниця між початковим числом зразків частотної області та цільовим числом зразків частотної області повинна бути рівним, щоб ви могли видалити ту саму кількість вибірок із позитивної сторони результатів, як і негативну сторону результатів. У випадку нашого прикладу початкова кількість зразків становила коефіцієнт децимації, або 441, а цільовим числом зразків була швидкість інтерполяції, або 160. Різниця становить 279, що не є рівним. Рішення полягає в тому, щоб подвоїти довжину FFT до 882, що призводить до того, що цільова кількість зразків також подвоїться до 320. Тепер різниця рівномірна, і ви можете без проблем скидати відповідні зразки частотної області.


Дуже хороша. Як ти робиш такі приємні фігури на льоту, Джіме?
Спейсі

@Mohammad Я зазвичай використовую Powerpoint. У цьому випадку я використав версію програми Powerpoint Libre Office, яку, на мою думку, називають "Impress".
Джим Клей

Здрастуйте, у мене питання щодо Вашого питання (2). Що саме ви маєте на увазі на цьому кроці: "... а потім вивільнення високої частоти (> 8 кГц) призводить до отримання низькочастотних (<8 кГц) результатів, перш ніж скидати результати високої частоти." Я розумію кроки до цього. Після того як я помножую дані f-домену на f-домен мого фільтра, що робити? Також, чи працює цей метод, якщо ви хочете збільшити вибірку своїх даних? Дякую.
TheGrapeBeyond

@TheGrapeBeyond Коли ви псевдонімом у часовій області додаєте всі зони Nyquist разом. Перші елементи всіх зон Nyquist складаються разом і стають новим першим елементом першої зони Nyquist. Другий елемент усіх зон Nyquist об'єднується і стає новим другим елементом першої зони Nyquist тощо.
Джим Клей

Хм, я не впевнений, що я розумію, як ви робите перекомпонування на основі FFT, тому що коли я спробую це, я отримую дуже дивні результати. Я поставлю питання про це.
TheGrapeBeyond

3

Хоча відповідь вище справді повна:

Ось суть його:

  1. щоб зменшити вибірку сигналу, це повинно бути ціле число. Перед тим, як дискретизувати сигнал вниз, потрібно відфільтрувати сигнал.
  2. Ви можете отримати раціональне зменшення кількості номерів, спершу підбираючи вгору / інтерполюючи сигнал.
  3. Підсистема простого вставки нулів, а потім ФІЛЬТРУВАННЯ сигналу.
  4. щоб досягти 3/4 норми вибірки. збільшити вибірку сигналу, вставивши 4 нулі між кожним зразком сигналу. Застосовуємо фільтр. Потім ФІЛЬТУЙТЕ сигнал і видаляйте кожні 3 з кожні 4 зразки сигналу.

Детальніше про це:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

Також: якщо абсолютно не потрібно НЕ комп’ютер FFT, щоб потім обчислити IFFT. Це неймовірно повільний процес, і його вважають недоцільним для більшості завдань обробки сигналів. FFT зазвичай використовується для аналізу проблеми або застосування обробки сигналів тільки в частотній області.


1

Як казав Бьорн Рош, використовувати FFT для цього було б дуже неефективно. Але тут це виходить дуже просто, використовуючи метод фільтру пробірки і зменшення вибірки в частотній області.

1 - Візьміть потрібний векторний сигнал довжиною N.

2 - Виконайте N FFT FFT.

3 - нульовий перехід FFT зі 160 * N нулями в середині вектора FFT.

4 - Виконайте IFFT

5 - Виберіть один із 441 зразків, відкидаючи інші 440.

Вам залишиться вектор довжиною N * 160/441, який буде вашим перепробованим сигналом.

Як ви бачите, ви робите безліч безглуздих обчислень, адже більшість результатів будуть викинуті. Але якщо у вас є доступ до коду, який виконує FFT, ви можете насправді його трохи змінити, тому він обчислює лише результати IFFT, які ви закінчите, а не ті, які ви викинете.

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.