КЛП-Спектр

  • Автор темы X-Stranger
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

X-Stranger

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

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

Заранее спасибо :)
 
G

Guest

X-Stranger


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

Guest

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

X-Stranger

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

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

Guest

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

X-Stranger

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

Peter

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

Peter

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

abibok

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

Guest

X-Stranger
кароче вот что мне на работе посказали - довожу дословно
для этого надо сесть и немного пописать на бумажке...
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))|
 
A

abibok

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

Guest

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

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. Иногда и больше.
Вобщем, с наскока сразу не сделаешь, потратишь некоторое время. Зато в Матлабе получается всё красиво

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

Код:
#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;
}
 
L

logosman

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