КЛП-Спектр

Тема в разделе "Общие вопросы по С и С++", создана пользователем X-Stranger, 17 май 2004.

Статус темы:
Закрыта.
  1. X-Stranger

    X-Stranger Гость

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

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

    Заранее спасибо :)
     
  2. Гость

    X-Stranger
    http://www.v.psiola.ru/prj/lib.htm

    посмотри кое что про эту библиотеку.
    я так понял она уже реальзована.
     
  3. Guest

    Guest Гость

    Она то реализована, только никому не раздается, а если и раздается, то за деньги, а я всего лишь прошу кусочек Сишного кода :)
     
  4. X-Stranger

    X-Stranger Гость

    Google'ом пользоваться я умею. Провел три дня в поисках кода и знаю, что предлагаемая ссылка это не то. Куча линков, а нужного нет.

    МОжет все же кто-то знает, как реализовать это на С/C++?
     
  5. Гость

    X-Stranger
    А алгоритм есть её? Просто я не совсем в курсе этой фичи. Хотя бы на алгоритм глянуть, чтобы знать что писать.
     
  6. X-Stranger

    X-Stranger Гость

    Знал бы алгоритм - сам бы написал. Проблема в том, чтобы найти именно алгоритм по шагам или его реализацию. На данный момент я уже нашел как считать сами коэффициенты линейного предсказания методом автокорелляции. Ну получил я эти коэффициенты, а как получить их энергетический спектр? И написать это все на C?
     
  7. Peter

    Peter Гость

    Насколько я помню из курса ЦОС, чем больше коэффициент тем большая энергия в нем сосредоточена, собсна и все
     
  8. Peter

    Peter Гость

    Что за линейное предсказание, можешь хотя бы суть пояснить? И чем тебя не устраивает оконное преобразование фурье, оно дает спектр по времени (тока про принцип неопределенности не надо забывать) , а вообще вэйвлеты здесь рулят больше.
     
  9. abibok

    abibok Гость

    Intel Signal Processing Library и Intel Recognition Primitives Library. Там есть все, что вам нужно.
     
  10. Гость

    X-Stranger
    кароче вот что мне на работе посказали - довожу дословно
     
  11. abibok

    abibok Гость

    Ну и как по этому описанию составить алгоритм? Это все теория, теории - полный интернет. А толковую библиотеку - днем с огнем. Говорю - используйте Intel, хорошая штука.
     
  12. Guest

    Guest Гость

    хех, хСтренжер тут уже тут ;). Нашёл где по данным темам спрашивать ;)
     
  13. Guest

    Guest Гость

    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))|

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

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

    Код (Text):
    #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;
    }
     
  14. logosman

    logosman Гость

    Ну что я могу сказать по этому поводу? Есть отличная книжка старого издания:
    Автор: Гоноровский (инициалы не помню)
    Название: Радиотехнические цепи и сигналы, I том
    Ещё в универе этот вопрос обсасывался, а там даже примерчик есть, помоему на АЛГОЛе.
    Помню что в этом ничего сложного нет, а книгу можно эту достать у нас в БГУиР (РТИ) если есть знакомые.
    Удачи.
     
Статус темы:
Закрыта.

Поделиться этой страницей