STFT і DWT (вейвлети)


12

STFT можна успішно використовувати на звукових даних (наприклад, з звуковим файлом .wav) для того, щоб зробити деякі зміни частоти домену (приклад: видалення шуму).
З N=441000(тобто 10 секунд при частоті дискретизації fs=44100), windowsize=4096, overlap=4, виробляє Апроксимаційні STFT в 430x4096масив (перший координат: тимчасові рамки, друга координата: по частоті). На цьому масиві можна здійснити модифікації, а реконструкцію можна виконати за допомогою перекриття-add (*).

Як можна зробити подібну річ з вейвлетами ? (DWT), тобто отримати подібний масив форми a x b, з aтимчасовими кадрами та bчастотами, чи внести якісь зміни на цей масив, і в кінці відновити сигнал? Як? Що таке вейвлет, еквівалентний накладання-додавання ? Якими були б тут функції Python (я не знайшов простий приклад зміни звуку за допомогою pyWavelets...)?

(*): Ось рамка STFT, яку можна використовувати:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output

Мета - знайти подібний фреймворк з вейвлетами.


Побічний коментар: робити таку "фільтрацію" на STFT - це дуже погана ідея. Це не чудовий спосіб зробити більшість справ, які ви дійсно хочете робити. Чого ви насправді намагаєтесь досягти?
Пітер К.

Зауважте, що PyWavelets призначений лише для дискретного перетворення вейвлетів. Якщо ви хочете робити подібні до STFT речі, ви легше зрозумієте безперервне перетворення вейвлетів, наприклад, постійне перетворення Q, яке є перетворенням Габора, по суті те саме, що і комплексне безперервне вейвлетське перетворення Morlet , але воно призначене для оборотна: grrrr.org/research/software/nsgt
ендоліти

1
(це питання відроджене "Спільнотою".) На мою думку, вейвлети перетинаються та додають таким чином, дуже схожим на STFT. тому я не зовсім розумію характер питання.
Роберт Брістоу-Джонсон

Чи потрібно більше деталей?
Лоран Дюваль

Відповіді:


4

Короткочасне перетворення Фур'є, як правило, є надмірним перетворенням, як правило, реалізоване з однаковим підсистемою на кожній частоті. Якщо вікно вибрано вдало, воно завершено: ви можете його перевернути та відновити будь-який початковий сигнал.

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

Стандартні дискретні вейвлет-перетворення теж є фільтруючими банками, з тією різницею, що піддиагностика не однакова у кожному діапазоні частот (або більш правильному масштабі). Це перетворюється на неоднакову довжину для кожної луски. Однак існують надлишкові вейвлет-реалізації, які дають "прямокутний масив" коефіцієнтів, з якими можна працювати. Найвідоміші схеми називаються під різними назвами: вейвлети зсуву або інваріантність часу , недециміновані вейвлети, стаціонарна вейвлетська трансформація(SWT), а іноді циклічно крутиться. Її стандартна реконструкція включає етапи, подібні до накладання-додавання, за винятком того, що вони більш "вбудовані" через різні коефіцієнти вибірки за масштабами. Ви можете використовувати їх з будь-яким дискретним вейвлетом з бібліотеки або навіть створивши свій власний вейвлет. Причина полягає в тому, що стандартні дискретні вейвлети були розроблені з урахуванням надмірності, що обмежує вибір вейвлетів. З надмірністю вибір вейвлетів збільшується, оскільки обмеження, які потрібно виконати, менш жорсткі. "Кінцевий" аватар - це неперервна вейвлет-трансформація, яка допускає "майже" кожен вейвлет зворотного синтезу. Моє останнє речення досить хитро, я сподіваюся, що ви отримаєте сенс: коли квадратна матриця є зворотною, вона має лише одну обернену. Коли "прямокутна" матриця залишається непереверненою в узагальненому вигляді,

Здається, що пітонна реалізація стаціонарної перетворення вейвлетів . Ви можете знайти кілька посилань у 2.3.4. Глава перекладу інваріантних вейвлетів зв'язаної статті .

Зазвичай це набагато надійніше для виявлення, позначання або відновлення у практичних програмах (геофізика, неруйнівне тестування, ультразвуки, вібрації).


"Надмірне" значення "має більше інформації у висновку, ніж необхідно для відтворення вхідних даних"?
ендоліт

1
Саме так. Зазвичай для зразкового сигналу ви отримуєте коефіцієнти після перетворення. Це означає, що ви можете використовувати це для своєї користі. Наприклад, ви отримуєте кілька потенційних обертів, деякі є більш практичними, ніж інші. Ще важливіше, що при обробці в області перетворення (посилення, виявлення, позначення, адаптивна фільтрація, відновлення, деконволюція, розділення джерела) ви отримуєте надійність та меншу чутливість до шуму. Це формує додаткову "різноманітність" в трансформованих даних. При правильному використанні ...M > NNM>N
Лоран Дюваль,

3

Причина, для якої потрібно зберегти додавання / перекриття для фільтрації за короткий час перетворення Фур'є, полягає в тому, що основні функції, пов'язані з отриманими коефіцієнтами, визначаються протягом певного часового діапазону (на відміну від одного моменту часу). Перетворення Фур'є, яке ви використовуєте для обчислення коефіцієнтів розширення, також реалізує згортку на круговій області, визначеній довжиною кадру сигналу. Це означає, що дві кінцеві точки кадру дійсно ідентифіковані та закриті по колу. Ось чому ви повинні переконатися, що основні функції коефіцієнтів, які ви редагуєте, ніколи не впливають на обидва кінці кадру, обертаючись навколо.

Вейвлети не є власними векторами перекладу часу, і не обчислюються за допомогою кругової згортки. Це означає, що вам не потрібно додавати або зберігати перекриття чи будь-які інші методи боротьби з побічними ефектами кругової згортки. Натомість вектори вейвлетів є лише можливою основою для опису вашого сигналу. Таким чином, (повна, дискретна, можливо ортогональна) вейвлет-трансформація - це не що інше, як зміна базису від бази часової області до основи вейвлет-домену. Зміни основи можуть бути інвертовані (застосувавши зворотну матрицю зміни бази, яка потрапила туди), і ви зможете перейти назад до часової області.

Параметри, які ви вказали як розмір вікна, перекриття, швидкість вибірки, не застосовуються до вейвлет-перетворення. Єдине, що вам потрібно, це материнська вейвлет. Якщо ви хочете порівняти результати з результатами STFT, ви можете обрати будь-який із базових векторів STFT (тобто ваше вікно, помножене на складний експоненційний носій) як прототип вейвлета. Потім ви застосуєте швидке вейвлет-перетворення, яке розкладе ваш сигнал на дерево з високофільтрованими та зниженими сигналами, що фільтруються з високою та низькою частотою, які в кінцевому підсумку стають вашими коефіцієнтами. Кожен коефіцієнт пов'язаний з вектором основи вейвлет та його параметрами (масштаб, час) або (частота, час). Ви можете маніпулювати коефіцієнтами, а потім застосувати зворотне дискретне перетворення вейвлетів. Це займе ваші коефіцієнти і запустить їх через банк фільтрів для ресинтезу, щоб знову подати сигнал.

Ці процеси не є тривіальними і, можливо, важко засвоюються для новачків. Але ви повинні мати змогу знаходити бібліотеки / скриньки інструментів для своєї платформи на вибір, які реалізують швидке перетворення вейвлетів та його зворотну. Однак якщо ви хочете реалізувати власну основу вейвлетів, вам доведеться вивести коефіцієнти фільтру для банків фільтрів для розкладання та синтезу. Для цього потрібна глибока теорія, і вам, мабуть, доведеться спочатку її вивчити.

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


1
Дякую за вашу відповідь. Основна причина, з якої я намагаюся мати рамку коду, - це те, що я завжди помічав (з дитинства до кількох років тому, коли закінчив докторську ступінь (не пов'язано з DSP, звичайно, якщо так, я б не запитував настільки новачки-запитання тут!)) полягає в тому, що маніпулювання деяким реальним матеріалом (наприклад, аудіосигналом у DSP) дуже допомагає зрозуміти глибоку теорію. Те , що я хотів би код: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Маючи багато (зробіть щось на масиві), я впевнений, що я трохи більше зрозумію, як працює вейвлет.
Бась

1
@Basj, тоді роби так, як я сказав. Знайдіть бібліотеку пітона, яка підтримує як швидке вейвлет-перетворення, так і його зворотну, а потім пограйте з генерованим деревом коефіцієнтів. Хай щастить!
Jazzmaniac

"всі не застосовуються до вейвлет-перетворення" Вони застосовні до CWT, правда?
ендоліт

1

Існує багато способів визначення основи вейвлетів. Зазвичай вейвлет виглядає приблизно так:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

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

Зазвичай для обмеження кількості вейвлетів використовується дискретні точки . Як і у вашому STFT, часто добре використовувати більшу кількість точок, ніж розмірність сигналу. Метою є наближення відповіді, яку ви отримаєте, використовуючи всі можливі , але з розумними обчислювальними ресурсами.(x0,k0)(x0,k0)

Оскільки розмірність трансформованих даних перевищує розмір сигналу, основа вейвлет не буде ортонормальним. Тобто, помилковим буде наступне:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Однак для відповідних і ви можете домовитись про те, що основа буде неповною:Aw

x0,k0|wx0,k01k0wx0,k0|=identity

Іншими словами, ви можете реконструювати сигнал ідеально, додавши його складові вейвлети.

Вашу "модифікацію" можна просто вставити у вказану вище суму:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Оновлення 2013-11-19 рр.: Додавання нижче деталей щодо впровадження відповідно до запиту.

Для деякого сигналу ми хочемо обчислити коефіцієнти:f(x)

cx0,k0=wx0,k0|f

Для фіксованого , може розглядатися як функція , і ця функція є просто відфільтрованою версією . Зокрема, це згортання з , яке ми можемо ефективно обчислити, використовуючи метод Фур'є. Таким чином, ми можемо ефективно обчислити всі наступним чином:k0cx0,k0x0ffw0,k0cx0,k0

  • Застосуйте перетворення Фур'є до щоб отримати . Ймовірно, ви хочете зробити це вікно за один раз, з достатньою кількістю накладок, щоб можна було викинути артефакти вікон тощо, але для простоти припустимо, що ви робите весь сигнал одразу, і що його довжина є потужністю дві.ff^
  • Для кожного в деякій геометричній прогресії з проміжком приблизно на пропускну здатність фільтра (або точніше, якщо потрібно): k01/4
    • Створіть добуток з .f^w^0,k0
    • Скоротіть спектр до деякого інтервалу , довжина якого є потужністю два, і який містить ненульову частину .[kl,kr)w^0,k0
    • До цього застосуйте зворотне перетворення Фур'є.
    • Помножте це на для виправлення фази. Результат розглядається як функція .exp(ixkl+kr2)cx0,k0x0

При цьому обчислюються всі коефіцієнти вейвлет. Ви можете вибрати роздільну здатність в , налаштувавши співвідношення в геометричній прогресії. Роздільна здатність у задається довжиною усіченого спектру і змінюватиметься залежно від пропускної здатності , що в свою чергу залежить від . Обчислювальні зусилля - це одне перетворення Фур'є з високою часовою роздільною здатністю, плюс одне зворотне перетворення Фур'є для кожного значення при набагато нижчому дозволі часу. Він працює приблизно так само, як і STFT - можливо, повільніше якийсь невеликий фактор, який залежить від обраної вами роздільної здатності.k0x0w0,k0k0k0

Потім ви можете змінити як вважаєте за потрібне, і ви можете реконструювати сигнал, повернувши вищевказаний процес, підсумовуючи спектри по перш ніж нарешті зробити загальне зворотне перетворення Фур'є.cx0,k0k0

Спектри обрізання іноді вводять проблеми нормалізації, залежно від того, як визначено ваш FFT. Я не буду намагатися охопити всі можливості тут. Нормалізація - це в основному проста проблема. ;-)

Залишилося лише вибрати відповідний конверт вейвлета. Виявляється, легше отримати право, ніж отримати прямо. Відповідне визначення (з багатьох можливостей) таке:w^x0,k0(k)wx0,k0(x)

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

в якій - безрозмірна константа, яка вибирає пропускну здатність вашого фільтра, тобто роздільну здатність частот ваших вейвлетів, а вибирається за необхідності для нормалізації. З цим визначенням і достатньо високою роздільною здатністю для виконується умова перевиконання, і реконструкція сигналу запрацює.A k 0QAk0


1
Дякую, що згадуєте ці важливі моменти теорії вейвлетів, які дійсно необхідні, щоб зрозуміти, як вона працює. Але тут питання стосуватиметься, зокрема, побудови рамкового коду, який би працював на звуковому сигналі. Питання: як боротися з цими нескінченними сумами, як вибрати вікна (а точніше материнську вейвлет ), як це зробити за допомогою pyWavelets на Python (або іншою рівнозначною мовою, я тоді перекладу на Python), як виберіть параметри (як у моєму прикладі для аудіо: частота дискретизації = 44100, вікно
fft

Ваше уявлення про неповноту не є точним. База, що є повною, означає, що канонічний проектор на основі - це оператор ідентичності. Але писати як суму зовнішнього твору вам потрібна ортонормальність. Для надмірності ви не можете мати ортонормальність, так що зовнішнє розкладання продукту не працює. Але ви можете змусити його працювати, сказавши, що база є повною (і, можливо, перевиконаною), якщо є коефіцієнти так щоk | до додо | = Я дakk|kakk|=Id
Jazzmaniac

Хм, ви ввели вейвлет morlet, але у всіх вейвлет немає fb і fc, тому вони можуть мати постійний , також неможливо зробити DWT з morlet, bx не є ортогональним, насправді я не міг отримати чітку роздільну здатність для оцінки частоти за допомогою DWT порівняти з cwt або STFT @ apt1002K
Electricman

Крім того, знаходження цих коефіцієнтів нетривіально, а також не унікальне. Лінійна залежність базисного вектора означає, що таких існує нескінченно багато можливих, якщо основа є неповною. Це означає, що ваш "фільтр" недостатньо визначений, насправді він зовсім не визначений, оскільки ви не знаєте, чим керуєте за допомогою функції фільтра . Кожен аспект сигналу реалізований у багатьох лінійно-залежних векторових базисних векторах. Тож ваша теорія розпадається. a k fakakf
Jazzmaniac

1
Найкращим способом побачити, працює він чи ні, було б надати мінімальний приклад коду (наприклад, з pyWavelet це повинно бути можливим у кількох рядках, які я собі уявляю) (я зроблю це добре, як тільки це зрозумію, я думаю, що потрібно ще кілька днів читати про вейвлет!)
Basj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.