Быстрое преобразование Фурье принимает операций, в то время как быстрого вейвлет - преобразование принимает . Но что конкретно FWT вычисляет?O ( N )
Хотя их часто сравнивают, кажется, что FFT и FWT - это яблоки и апельсины. Насколько я понимаю, было бы более уместно сравнивать STFT (FFT небольших кусков во времени) со сложным Morlet WT , так как они являются частотно-временными представлениями, основанными на сложных синусоидах (пожалуйста, исправьте меня, если я ошибаюсь ). Это часто показано на следующей диаграмме:
( Еще один пример )
Слева показано, как STFT представляет собой набор FFT, сложенных друг на друге с течением времени (это представление является источником спектрограммы ), а справа - диадический WT, который имеет лучшее временное разрешение на высоких частотах и лучшую частоту разрешение на низких частотах (это представление называется скалограммой ). В этом примере для STFT - это число вертикальных столбцов (6), и одна операция FFT вычисляет одну строку из коэффициентов из выборок. Всего 8 БПФ по 6 точек в каждом, или 48 выборок во временной области.O ( N log N ) N N
Что я не понимаю:
Сколько коэффициентов вычисляет одна операция FWT и где они расположены на частотно-временной диаграмме выше?
Какие прямоугольники заполняются одним вычислением?
Если мы вычислим блок частотно-временных коэффициентов равной площади, используя оба, получим ли мы одинаковое количество данных?
FWT все еще более эффективен, чем FFT?
Конкретный пример с использованием PyWavelets :
In [2]: dwt([1, 0, 0, 0, 0, 0, 0, 0], 'haar')
Out[2]:
(array([ 0.70710678, 0. , 0. , 0. ]),
array([ 0.70710678, 0. , 0. , 0. ]))
Он создает два набора по 4 коэффициента, поэтому он равен количеству выборок в исходном сигнале. Но какова связь между этими 8 коэффициентами и плитками на диаграмме?
Обновить:
На самом деле, я, вероятно, делал это неправильно, и должен был использовать wavedec()
, который выполняет многоуровневую декомпозицию DWT:
In [4]: wavedec([1, 0, 0, 0, 0, 0, 0, 0], 'haar')
Out[4]:
[array([ 0.35355339]),
array([ 0.35355339]),
array([ 0.5, 0. ]),
array([ 0.70710678, 0. , 0. , 0. ])]