Поиск:

Ответ в темуСоздание новой темы Создание опроса
> КЛП-Спектр, надо помощь профи! 
:(
    Опции темы
КидерOK
Дата 18.5.2004, 16:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет всем. Пишу программу по обработке речевых сигналов. Если реализация ДПФ и Полосовых Фильтров не составила труда, то вот с Коэффициентами Линейного Предсказания возник трабл

Может быть кто-то знает простой алгоритм для вычисления спектра речевого сигнала на основе линейного предсказания? Естесственно, алгоритм пишется на C/C++. Если кто-то знает, напишите пожалуйста кусок кода хотя бы для анализа текущего сегмента (окна).

Заранее спасибо
  Вверх
Guest
Дата 19.5.2004, 22:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











народ хелп горю
  Вверх
maxim1000
Дата 20.5.2004, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



для этого надо сесть и немного пописать на бумажке...
z - оператор запаздывания
s - сигнал
A(z) - полином, соответствующий модели линейного предсказания
e=A(z^-1)s - ошибка линейного предсказания
E(w) - значение спектра сигнала e на частоте w
S(w) - соответственно для сигнала s
T - период дискретизации
тогда:
E(w)=A(exp(-iwT)S(w)
S(w)=E(w) / A(exp(-iwT))
|S(w)|=|E(w)| / |A(exp(-iwT))|
обычно в данной модели принимают |E(w)|=E - не зависит от w, т.е. e - сигнал типа "белый шум"
тогда получается:
|S(w)|=E / |A(exp(-iwT))|

Это сообщение отредактировал(а) maxim1000 - 20.5.2004, 11:17


--------------------
qqq
PM WWW   Вверх
Guest
Дата 29.5.2004, 16:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну и как по этому описанию составить алгоритм? Это все теория, теории - полный интернет. А толковую библиотеку - днем с огнем.
  Вверх
maxim1000
Дата 29.5.2004, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



1. берем кусок сигнала
2. находим такие коэффициенты полинома A, чтобы среднеквадратическая ошибка была наименьшей. Обычно это делают через автокорреляционную функцию - решают систему линейных уравнений: c(j+1)=a1*c(j)+a2*c(j-1)+...+am*c(j-m+1)
3. при определении коэффициентов полинома A также определяем среднеквадратическое значение сигнала ошибки
4. вычисляем модуль спектра |S(w)|=E / |A(exp(-iwT))|
Цитата
Это все теория, теории - полный интернет

ну так обычно в теории и дается алгоритм



--------------------
qqq
PM WWW   Вверх
podval
Дата 1.6.2004, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Алгоритм простой - решить уравнение, записанное в самом конце статьи (уравнение Юла-Уокера).
Коэффициенты от 1 до a(p) - искомые коэффициенты LPC-фильтра.
Добавлено @ 22:28
З.Ы. поскольку обрабатываешь речь, самый действенный способ - решить уравнение "в лоб".
Всякие "навороченные" методы, которые могут ускорить вычисления, обладают плохой устойчивостью, особеннно когда матрица R плохо обусловлена. Будешь получать всякие exception' ы из-за того, что напрашивается решение с комплексными коэффициентами.
Положение осложняется тем, что для речи порядок LPC фильтра должен быть не ниже 12. Иногда и больше.
Вобщем, с наскока сразу не сделаешь, потратишь некоторое время. Зато в Матлабе получается всё красиво smile.gif

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Youle.doc
PM WWW ICQ   Вверх
podval
Дата 2.6.2004, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Как пример - процедура Левинсона-Дарбина. Не самое лучшее решение, но наведет на мысли.

Код

#include <math.h>
#include <stdlib.h>
#include <stdio.h>

/*
Calculation of LPC filter koeffs using Levinson - Durbin recursion.

*acf = ponter to array of autocorrelation function values acf[0], acf[1]....acf[lpc_order]

*lpc = pointer to filter koeffs calculated by function  a[0],a[1]...a[lpc_order-1]

lpc_order = the order of LPC
*/

float lpc(float *acf, float *lpc, int lpc_order)
{

int i,j;
float tmp0,E,Pk;
float *tmp;

tmp=(float *)malloc(lpc_order*sizeof(float));

E=acf[0];
for(i=0;i<lpc_order;i++) lpc[i]=0.0;

for(i=0;i<lpc_order;i++)
{
tmp0=acf[i+1];
for(j=0;j<i;j++) tmp0-=lpc[j]*acf[i-j];

if(fabs(tmp0)>=E) break;

lpc[i]=Pk=tmp0/E;
E-=tmp0*Pk;
for(j=0;j<i;j++) tmp[j]=lpc[j];
for(j=0;j<i;j++) lpc[j]-=Pk*tmp[i-j-1];
}

free(tmp);

return E;
}

/*

LPC analyse FIR filter (whitening filter)

*data = pointer to input/output data
*lpc = pointer to filter koeffs
*z = pointer to filter memory

data_length = the length of the data to be processed
lpc_order = the order of LPC

*/

void lpc_analyse_filter(float *data,float *lpc,float *z,int data_length,int lpc_order)
{
int i,j;
float tmp;

for(i=0;i<data_length;i++)
{
tmp=data[i];
for(j=0;j<lpc_order;j++) tmp-=z[j]*lpc[j];
for(j=lpc_order-1;j>0;j--) z[j]=z[j-1];
z[0]=data[i];
data[i]=tmp;
}
return;
}

/*

LPC synthesis IIR filter (modeling filter)

*data = pointer to input/output data
*lpc = pointer to filter koeffs
*z = pointer to filter memory

data_length = the length of the data to be processed
lpc_order = the order of LPC

*/


void lpc_synthesis_filter(float *data,float *lpc,float *z,int data_length,int lpc_order)
{
int i,j;
float tmp;

for(i=0;i<data_length;i++)
{
tmp=data[i];
for(j=0;j<lpc_order;j++) tmp+=z[j]*lpc[j];
for(j=lpc_order-1;j>0;j--) z[j]=z[j-1];
z[0]=data[i]=tmp;
}
return;
}

PM WWW ICQ   Вверх
maxim1000
Дата 2.6.2004, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
Как пример - процедура Левинсона-Дарбина. Не самое лучшее решение, но наведет на мысли.

упс... в моей магистерской как раз используется этот метод...
а нельзя ли подробней почему? (а то надо быть готовым к этому на защите smile.gif)


--------------------
qqq
PM WWW   Вверх
podval
Дата 3.6.2004, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



А что тут говорить? Итеративная процедура, придуманная ого-го когда. На защите наверняка могут спросить об устойчивости синтезированного фильтра. Если фильтр неустойчив, то при малом входном сигнале можно получить очень большой выходной. Скажешь, как ввести проверку условия устойчивости.
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.