오디 오 알고리즘 speex 의 aec 분석 및 분석

6799 단어
알고리즘 원리:
Speex 의 AEC 는 NLMS (Normalized Least Mean Square) 를 기반 으로 MDF (multidelay block frequency domain) 주파수 영역 으로 구현 되 며 최종 적 으로 최 적 화 된 보폭 추정: 잔여 메아리 와 오차 의 비례 를 도 출 한다.가장 좋 은 보폭 은 잔여 메아리 방 차 와 오차 신호 방 차 의 비례 와 같다.유출 계수 와 관련 된 부분의 코드 를 고 쳐 야 효과 에 가장 큰 영향 을 미 치 는 곳 이다. 유출 계수 에 따라 필터 의 최 적 화 된 보폭 이 예상 되 기 때문이다.
인 스 턴 스 사용:
테스트 코드:
 #include "speex/speex_echo.h"
#include "speex/speex_preprocess.h"
#include 
#include 
#include 
#include 
#include 


#define NN 128
#define TAIL 1024

int main(int argc, char **argv)
{
   FILE *echo_fd, *ref_fd, *e_fd;
   short echo_buf[NN], ref_buf[NN], e_buf[NN];
   SpeexEchoState *st;
   SpeexPreprocessState *den;
   int sampleRate = 8000;

   if (argc != 4)
   {   
      fprintf(stderr, "testecho mic_signal.sw speaker_signal.sw output.sw
"); exit(1); } echo_fd = fopen(argv[2], "rb"); ref_fd = fopen(argv[1], "rb"); e_fd = fopen(argv[3], "wb"); st = speex_echo_state_init(NN, TAIL); den = speex_preprocess_state_init(NN, sampleRate); speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate); speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st); while (!feof(ref_fd) && !feof(echo_fd)) { fread(ref_buf, sizeof(short), NN, ref_fd); fread(echo_buf, sizeof(short), NN, echo_fd); speex_echo_cancellation(st, ref_buf, echo_buf, e_buf); speex_preprocess_run(den, e_buf); fwrite(e_buf, sizeof(short), NN, e_fd); } speex_echo_state_destroy(st); speex_preprocess_state_destroy(den); fclose(e_fd); fclose(echo_fd); fclose(ref_fd); return 0; }

명령:... / testecho speaker 1. wav micin 1. wav out1. wav 테스트 결과: 최신 speex 의 aec 효과 가 매우 좋 습 니 다. 제 상상 을 뛰 어 넘 었 습 니 다. 메아리 제거 효과 가 보통 이 아 닌 것 같 습 니 다. speex 가 많이 업 데 이 트 된 것 같 습 니 다. 2007 년 이후 speex 는 오랫동안 코드 를 업데이트 하지 않 았 기 때 문 입 니 다.관심 있 는 학우 들 은 메아리 가 사라 진 후의 것 과 이전의 음성 대 비 를 들 어 볼 수 있다.
코드 분석:
초기 화 에서 첫 번 째 매개 변 수 는 매번 처리 하 는 프레임 길이 입 니 다. 이것 은 보통 10ms (80) 에서 30ms (240) 까지 의 처리 길이 입 니 다. 너무 길 고 짧 아서 좋 지 않 습 니 다. filterlength 도 길이 입 니 다. 사실은 speaker 에서 rec 사이 의 시간 차 입 니 다.이것 은 서로 다른 설비 에서 서로 다른 것 으로 제품 의 사용 장면, 구조, 그리고 소프트웨어 소모 시간 과 관계 가 있 으 며 일반적으로 테스트 할 수 있다.SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length)
시스템 의 기본 메아리 샘플링 은 8k 입 니 다. 다음 과 같 습 니 다. 샘플링 빈 도 를 바 꾸 고 싶다 면 / * This is the default sampling rate * / 427 st - > samplingrate = 8000; 428 st->spec_average = DIV32_16(SHL32(EXTEND32(st->frame_size), 15), st->sampling_rate); 아래 함수 사용 하기: speexpreprocess_state_init (NN, sample Rate) 다음은 소 리 를 없 애 는 매개 변수 설정 입 니 다. 보통 샘플링 율 설정 입 니 다.speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);매개 변 수 는 다음 과 같 습 니 다.
46 /** Obtain frame size used by the AEC */ 47 #define SPEEX_ECHO_GET_FRAME_SIZE 3 48 49 /** Set sampling rate */ 50 #define SPEEX_ECHO_SET_SAMPLING_RATE 24 51 /** Get sampling rate */ 52 #define SPEEX_ECHO_GET_SAMPLING_RATE 25 53 54 /* Can't set window sizes */ 55 /** Get size of impulse response */ 56 #define SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE 27 57 58 /* Can't set window content */ 59 /** Get impulse response (int32[]) */ 60 #define SPEEX_ECHO_GET_IMPULSE_RESPONSE 29
가장 중요 한 함수 가 등 장 했 습 니 다. 이 함 수 는 아주 좋 습 니 다. 입 삼 만 보면 어떻게 사용 하 는 지 알 수 있 을 것 같 습 니 다.구체 적 인 사용 은 위의 예 를 보 세 요.void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *in, const spx_int16_t *far_end, spx_int16_t *out)
예 처리 중 일부 파라미터 설정 이 있 으 면 예 처리 함 수 를 호출해 서 출력 결 과 를 처리 해 야 합 니 다. 예 처리 가 없 으 면 필요 없습니다.speex_preprocess_run(den, e_buf);사실 코드 프로 세 스 는 이렇게 간단 하지만 시스템 효 과 를 잘 디 버 깅 하려 면 많은 시간 이 필요 합 니 다.
주의사항:
1 AEC 의 선형 알고리즘 은 Non - linear distortion (비 선형 일 그 러 짐) 2 를 처리 할 수 없습니다. 다른 예비 처리 전에 AEC 3 speex 의 aec 를 먼저 호출 하 는 것 은 음향 시스템 에 적합 하지 않 으 므 로 음향 에 서 는 신중 해 야 합 니 다.이어폰 의 효 과 는 그런대로 좋다.4. 실험 용 오디 오 데 이 터 는 여기에 두 지 않 습 니 다. 메 일 을 남 길 수 있 는 사람 이 있 으 면 보 내 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기