LINUX.ORG.RU

speex echo cancelling


0

0

Вот исходный код моей программы:

#include <stdio.h>

#include <speex/speex_echo.h>

#include <sys/stat.h>

#include <stdlib.h>

#include <speex/speex.h>

int main(){

char *without_echo_f=«sound.raw»;

char *with_echo_f=«ss.raw»;

struct stat info1,info2;

char *without_echo,*with_echo,*after_cancel;

SpeexEchoState *echo_state;

int rc; if(stat(without_echo_f,&info1)==-1){

printf(«Error while stat!\n»);

exit(1); } if(stat(with_echo_f,&info2)==-1){

printf(«Error while stat!\n»);

exit(1);

} //printf(«Size of without_echo is %d bytes.\n»,(int)info1.st_size);

//printf(«Size of with_echo is %d bytes.\n»,(int)info2.st_size); without_echo = (char *) malloc((int)info1.st_size);

with_echo = (char *) malloc((int)info2.st_size);

after_cancel = (char *) malloc((int)info2.st_size); echo_state = speex_echo_state_init(100000,10); speex_echo_cancellation(echo_state, without_echo, with_echo, after_cancel); rc = write(1, after_cancel, (int)info2.st_size);

if (rc != (int)info2.st_size){

fprintf(stderr,«short write: wrote %d bytes\n», rc);

} free(after_cancel);

free(with_echo);

free(without_echo);

}

Но все равно в итоге при запуске (./echocanc > echocanc.raw ) получаю white noise . Подозреваю на параметры speex_echo_state_init. Если кто-то знает подскажите. Заранее благодарен.


Осильте лоркод.

bk_ ★★
()

Как-то так, видимо:

#include <stdio.h>
#include <speex/speex_echo.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <speex/speex.h>

int main(){

char *without_echo_f="sound.raw";

char *with_echo_f="ss.raw";

struct stat info1,info2;

char *without_echo,*with_echo,*after_cancel;

SpeexEchoState *echo_state;

int rc; if(stat(without_echo_f,&info1)==-1){

printf("Error while stat!\n");

exit(1); } if(stat(with_echo_f,&info2)==-1){

printf("Error while stat!\n");

exit(1);

} //printf("Size of without_echo is %d bytes.\n",(int)info1.st_size);

//printf("Size of with_echo is %d bytes.\n",(int)info2.st_size); without_echo = (char *) malloc((int)info1.st_size);

with_echo = (char *) malloc((int)info2.st_size);

after_cancel = (char *) malloc((int)info2.st_size); echo_state = speex_echo_state_init(100000,10); speex_echo_cancellation(echo_state, without_echo, with_echo, after_cancel); rc = write(1, after_cancel, (int)info2.st_size);

if (rc != (int)info2.st_size){

fprintf(stderr,"short write: wrote %d bytes\n", rc);

} free(after_cancel);

free(with_echo);

free(without_echo);

}

AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR

ещё бы отступы расставить как у людей

AnDoR ★★★★★
()

> Подозреваю на параметры speex_echo_state_init

Правильно подозреваете. Вы выбрали слишком большое значение параметра frame_size. Как я понимаю, вы пытаетесь за один раз обработать сразу все данные (100000 сэмплов). Однако алгоритм эхокомпенсации оптимизирован для работы с кадрами длительностью ~20 мс (~160 сэмплов при частоте дискретизации 8 кГц). В вашем же случае эхокомпенсация работать не будет, и на выходе должен получится почти не измененный «with_echo» звук. Я экспериментировал с различными размерами фрейма (16-10000 сэмплов), и в итоге оптимальным считаю размер 128.

Также добавлю пару слов про второй параметр - tail_length. Его смысл мне доконца не ясен, но скорее всего это задержка появления эхо. С этим параметром я тоже экспериментировал (1-1000), но существенной разницы замечено не было.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.