Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Алгоритм выч. спектра сигнала используя вейвлеты


Автор: Proger10 1.7.2010, 00:10
Прочитал про вейвлеты. Пишут, что они точнее, быстрее и прочие хорошие вещи) Долго и упорно читал огромное собрание информации по этой теме на этом сайте и исходящих ссылок с него. Очень много узнал нового, но так и не понял, как вообще строится спектр сигнала, используя вейвлеты?

Второе, что непонятно, это - что такое вейвлет-пакеты? На этом форуме нашёл такой вопрос, где ответом было - в гугл) куда я, естественно, тоже сходил, но.. и там глухо :( Так и не понял, что называют вейвлет-пакетами?

Используя ДПФ построил уже спектр, теперь хочу получить небольшой опыт по использованию вейвлетов, разобраться что это такое и что из этого можно извлечь положительного в задачу распознавания речи. (покуда podval что-то не очень лестно отзывался о вейвлетах именно при распознавании речи). Может что-то полезное там всё-таки есть, что в купе с другими будет получен некоторый выигрыш при решении задачи?)

Автор: W4FhLF 1.7.2010, 10:35
Вообще для начала следует понять, что все инструменты хороши для определённых целей. Нет абсолютно плохих и абсолютно хороших методов.

Второе, использовать вейвлеты непосредственно для распознавания конечно же никак нельзя. Насколько я понимаю речь идёт о препроцессинге. В спектральной области мы можем подавить гармоники определённой частоты, в области вейвлетов можно подавить эффекты разного масштаба, которые заранее известно, что не связаны с речью и представляют собой некоторый шум. 

При вейвлет преобразованиях никакого спектра не строится. Главное их преимущество как раз в том, что мы остаёмся в том же пространстве во временной области, в отличии от ДПФ, где имеет место быть переход в частотную область и мы уже теряем множество информации об эффектах, которые имеют место быть в исходном сигнале. 

А чтобы лучше понять, что такое вейвлеты и как они работают на реальных примерах и задачах и советую использовать Matlab Wavelet Toolbox и пошаговое руководство, которое идёт с ним же. 


Автор: Proger10 1.7.2010, 15:48
Да, речь о предпроцессинге идёт, а не о полном переходе на вейвлеты.

Цитата
При вейвлет преобразованиях никакого спектра не строится. 
....
В спектральной области мы можем подавить гармоники определённой частоты, в области вейвлетов можно подавить эффекты разного масштаба, которые заранее известно, что не связаны с речью и представляют собой некоторый шум. 

Вот тут не очень понятно.. Мы можем через вейвлеты как-то получать гармоники определённой частоты? Просто, если вейвлеты не позволяют строить спектра, то чего нам предлагают делать вейвлеты?)

Цитата
А чтобы лучше понять, что такое вейвлеты и как они работают на реальных примерах и задачах и советую использовать Matlab Wavelet Toolbox и пошаговое руководство, которое идёт с ним же. 

Спасибо! Поставлю Матлаб, интересно будет посмотреть их в действии, прежде, чем я сам приступлю к их кодингу)

Автор: W4FhLF 1.7.2010, 16:15
Цитата(Proger10 @  1.7.2010,  15:48 Найти цитируемый пост)
Мы можем через вейвлеты как-то получать гармоники определённой частоты? Просто, если вейвлеты не позволяют строить спектра, то чего нам предлагают делать вейвлеты?)


Ну а что мир клином на спектрах сошёлся?)

http://www.mathworks.com/access/helpdesk/help/toolbox/wavelet/ch01_in6.html -- читать здесь и следующие три страницы. 

Автор: Proger10 1.7.2010, 17:32
Хм, точно smile

Спасибо за ссылку! Многое уже прояснилось! Хотя немного что разобрал там.

Кстати, а нет ли каких готовых программ, которые строят вейвлетовые графики? smile Что-то типа вот того: http://www.mathworks.com/access/helpdesk/help/toolbox/wavelet/ch01_i30.gif
Так гораздо проще было бы понять, что из себя вейвлеты представляют. Говоришь там в микрофон, а оно тебе сразу вейвлетами график разукрашивает... smile

Вообще, график на сонограмму похож, но, чувствую, именно это меня с толку и сбивает сейчас.. Там в вейвлетах какое-то другое видение мира должно быть smile

Автор: Pavia 1.7.2010, 18:46
Цитата(W4FhLF @  1.7.2010,  10:35 Найти цитируемый пост)
При вейвлет преобразованиях никакого спектра не строится. Главное их преимущество как раз в том, что мы остаёмся в том же пространстве во временной области, в отличии от ДПФ, где имеет место быть переход в частотную область и мы уже теряем множество информации об эффектах, которые имеют место быть в исходном сигнале. 

Не согласен. При вайвлет преобразовании мы получаем график который называется спектором.
Спектр- есть распределение чего либы не обязательно частот. Во вторых если взять в качестве базового вайвлета sin или cos то получаем настоящий спектр (вернее сонограмму) и именно имеем переход в частотную область. 


Цитата(W4FhLF @  1.7.2010,  10:35 Найти цитируемый пост)
Второе, использовать вейвлеты непосредственно для распознавания конечно же никак нельзя. Насколько я понимаю речь идёт о препроцессинге. В спектральной области мы можем подавить гармоники определённой частоты, в области вейвлетов можно подавить эффекты разного масштаба, которые заранее известно, что не связаны с речью и представляют собой некоторый шум. 

Еще как можно. 

Автор: Proger10 1.7.2010, 18:50
А что такое, кстати, вейвлет-пакеты? Пока не дошёл до определения "базовый вейвлет" smile базовый, это такой там?)

Автор: Фантом 1.7.2010, 22:52
Цитата(W4FhLF @  1.7.2010,  10:35 Найти цитируемый пост)

При вейвлет преобразованиях никакого спектра не строится. Главное их преимущество как раз в том, что мы остаёмся в том же пространстве во временной области, в отличии от ДПФ, где имеет место быть переход в частотную область и мы уже теряем множество информации об эффектах, которые имеют место быть в исходном сигнале. 

Не совсем удачно получилось. Правильнее было бы сказать, что вейвлет-преобразование - это представление исходного сигнала в виде разложения по базисным функциям некоторого "характерного" для данного сигнала вида (причем базис не обязательно будет полным). В этом смысле преобразование Фурье - фактически частный случай вейвлет-преобразования (с синусоидой в качестве "характерного" вида). Поскольку базис для преобразования Фурье полон, то теоретически при этом преобразовании ничего не теряется. А практически - потери происходят из-за использования конечного числа членов разложения.

Автор: Pavia 2.7.2010, 00:41
Цитата(Фантом @  1.7.2010,  22:52 Найти цитируемый пост)
А практически - потери происходят из-за использования конечного числа членов разложения.
  Разложения Фурье для конечного числа членов однозначно, ничто не теряется. Теряется раньше, когда мы берем выборку то краевые условия фактически становятся не определенными. 
Но после любого преобразования одни признаки становятся линейно не разделимыми, другие напротив разделимыми.

Автор: Фантом 2.7.2010, 00:56
Цитата(Pavia @  2.7.2010,  00:41 Найти цитируемый пост)
Разложения Фурье для конечного числа членов однозначно, ничто не теряется.

Насчет ознозначно - это верно. Но вот полным такое разложение не является. Тривиальнейший пример - возьмите один член разложения и попробуйте восстановить по нему исходный сигнал. smile

Автор: W4FhLF 2.7.2010, 03:37
Ну ладно, более опытные товарищи с термионологией меня раскаталиsmile Все правы.


Цитата(Pavia @  1.7.2010,  18:46 Найти цитируемый пост)
Еще как можно. 


Как?

Автор: Proger10 3.7.2010, 02:55
Что-то совсем не пойму.. Читаю вот здесь: http://www.mathworks.com/access/helpdesk/help/toolbox/wavelet/ch01_i10.html#1000760

Цитата
here are the five steps of an easy recipe for creating a CWT:
1. Take a wavelet and compare it to a section at the start of the original signal. 
2. Calculate a number, C, that represents how closely correlated the wavelet is with this section of the signal. The higher C is, the more the similarity. More precisely, if the signal energy and the wavelet energy are equal to one, C may be interpreted as a correlation coefficient.
3. Shift the wavelet to the right and repeat steps 1 and 2 until you've covered the whole signal.
4. Scale (stretch) the wavelet and repeat steps 1 through 3.
5. Repeat steps 1 through 4 for all scales. 


1. А откуда взять вейвлет-то этот? smile На первом шаге у меня же есть только исходный сигнал.. какой вейвлет берётся?
2. Насколько я понял по этому шагу, мы берём какой-то вейвлет) и сравниваем насколько он совпадает с нашим сигналом, что мы получим из переменной "C". Переменная двух аргументов, значит сдвиг и масштаб нам задавать самостоятельно? (подбирать, грубо говоря, чтобы максимально с сигналом совпадал?)
3. Сдвигаем правее вейвлет и получаем очередной коэффициент
4. Масштабируем и снова получаем кучу коэффициентов с шагов 1-3
5. Масштабируем, масштабируем..

И собственно что?)) Неужели по таким простым действиям можно получить что-то полезное?))

Автор: W4FhLF 3.7.2010, 12:21
Вообще руководство по Wavelet Toolbox (к тому же без использования этого самого Wavelet Toolbox) не заменит хорошую книжку по вейвлетам. Все эти вопросы от того, что кто-то ленится прочесть читать литературу. Предлагаешь цитировать здесь то, что уже давно написано в книгах?

1. Вычислить. Вейвлет это в сущности функция, которая удовлетворяет ряду условий. Существует много видов вейвлетов и для каждой задачи следует выбирать свой. Например для распознавания пиков и ступенек в данных я использую вейвлет haar или db1. Для подавления высокочастотного шума определённого характера db4, а для подавления импульсной реакции АЦП своей системы записи Morlet. Всё зависит от задачи короче.

На С++ простейший вейвлет Haar'a может выглядеть так:

Код

// Haar wavelet
class Haar: public Wavelet {
public:
    // Construct Haar wavelet
    Haar();

    Haar(const Haar& Src);
    
    // real and imaginary part of a wavelet in Time Domain
    virtual cwt_float_t reT(cwt_float_t t) const;
    virtual cwt_float_t imT(cwt_float_t t) const;
    // real and imaginary part of a wavelet in Frequency Domain
    virtual cwt_float_t reF(cwt_float_t w) const;
    virtual cwt_float_t imF(cwt_float_t w) const;
    
     // central frequency
    virtual cwt_float_t cFreq() const;
    // boundaries of effective support
    virtual cwt_float_t effL() const;
    virtual cwt_float_t effR() const;

    virtual Wavelet* clone() const;
};

// ============================ Haar Wavelet ===============================

// default params
static const char         Haar_Name[] = "Haar";
static const cwt_float_t  Haar_Fc     = 0.0;
static const cwt_float_t  Haar_r      = 1.0;

Haar::Haar()
: Wavelet(Haar_Name)
{ }

Haar::Haar(const Haar& Src)
: Wavelet(Src)
{ }

cwt_float_t Haar::reT(cwt_float_t t) const
{
    if( t >= -1.0/2.0 && t <  0.0 )     return  1.0;
    if( t >=  0.0     && t <  1.0/2.0 ) return -1.0;
    else return 0.0; 
}

cwt_float_t Haar::imT(cwt_float_t t) const
{
    return 0.0;
}

cwt_float_t Haar::reF(cwt_float_t w) const
{
    return 0.0;
}

cwt_float_t Haar::imF(cwt_float_t w) const
{
    double s = pow(sin(w/4), 2.0);
    return 4.0 * s / w; 
}

cwt_float_t Haar::cFreq() const
{
    return Haar_Fc;
}

cwt_float_t Haar::effL() const
{
    return -Haar_r;
}

cwt_float_t Haar::effR() const
{
    return +Haar_r;
}


2. Обычно проходятся по всем значениям сигнала и на них делают вейвлет преобразование. Преобразование на каждой точке и есть преобразование с заданным сдвигом (это порядковый номер значения сигнала). Ну и делают это для разных масштабов. А вычисление С есть своего рода свёртка сигнала на заданной точке с функцией вейвлета. 


Автор: Proger10 3.7.2010, 15:58
Спасибо большое за объяснение первого кода и отдельное за пример на С++! smile

Уже накачал книжек по вейвлетам, приступаю к чтению smile

Автор: Proger10 4.7.2010, 10:10
Посмотрел несколько книг по вейвлетам... не многим понятнее стало))) Сейчас ищу тему вейвлетов по интернету, тут куда более доступным языком написано. Вот, например, отличный док по Хаару, где поэтапно расписано на примере каким образом он работает: http://dmr.ath.cx/gfx/haar/
(там же есть реализация этой процедуры на С).
Это для тех, кто будет искать подобную тему smile

Но блин... и после этого мне не понятно как применять его)) Не пойму вот что - вот есть у нас исходный сигнал (отсчёты), а как применять этого Хаара и непонятно) Я могу пройтись по этому массиву (исходного сигнала) как сказано в алгоритме Хаара. Могу пройтись несколько раз (рекурсивно, имею ввиду). Но.. где все эти сдвиги, масштабирование?) Когда мне этими терминами-то оперировать надо, на какой стадии процесса?

После каждого прохода Хаара по массиву получается новый массив, состоящий из двух половин (в левой усреднённые пары, в правой - разница пар) - это и есть вейвлет-коэффициенты? Их что ли и строят на графике?

Автор: Фантом 4.7.2010, 10:47
Похоже, Вам лучше сначала прочитать что-то совсем общее, не связываясь с каким-то конкретным типом вейвлетов. Посмотрите, например, http://www.astro.spbu.ru/astro/publications/vityazev/wavelet.pdf, думаю, общая идея происходящего станет понятнее.

Автор: Proger10 4.7.2010, 11:41
Фантом, спасибо за литературу. Там описывается что-то очень похожее на тот алгоритм, что был тут чуток выше.. Если брать, в качестве примера, вейвлет MHAT - он зависит от двух переменных, тут вроде понятнее.. а Хаар вообще не понять от чего зависит smile как будто, прямо, ни от чего не зависит, сам по себе smile

Автор: Proger10 6.7.2010, 00:05
Вот тут нашёл: http://www.krsu.edu.kg/vestnik/2002/v2/a15.html формулу вейвлета Хаара: http://www.krsu.edu.kg/vestnik/2002/v2/img/a15_i01.gif

Теперь не пойму вот чего - а те действия с усреднением и разницей в массиве к чему тогда были? То, не Хаар чтоль?  smile 

Ну вот с этой формулой попроще, надеюсь, будет. Кстати, при подсчёте вейвлет-коэффициентов, интеграл там с какими пределами интегрирования брать? На что указывает эта область интегрирования?)

Автор: GTH 3.5.2011, 07:23
Для работы с вейвлетами используйте MatLab. Очень помогает. Кстати, есть неплохой видеокурс по работе с ним, для начинающих. 
Скачать можно тут:
http://www.turbobit.net/z27n2o12xctm.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)