KR100519001B1 - 통신 시스템에서 에코 억제 제어를 위한 방법 및 장치 - Google Patents
통신 시스템에서 에코 억제 제어를 위한 방법 및 장치 Download PDFInfo
- Publication number
- KR100519001B1 KR100519001B1 KR10-2000-7007535A KR20007007535A KR100519001B1 KR 100519001 B1 KR100519001 B1 KR 100519001B1 KR 20007007535 A KR20007007535 A KR 20007007535A KR 100519001 B1 KR100519001 B1 KR 100519001B1
- Authority
- KR
- South Korea
- Prior art keywords
- echo
- suppressor
- noise
- echo suppressor
- speech
- Prior art date
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M9/00—Arrangements for interconnection not involving centralised switching
- H04M9/08—Two-way loud-speaking telephone systems with means for conditioning the signal, e.g. for suppressing echoes for one or both directions of traffic
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M9/00—Arrangements for interconnection not involving centralised switching
- H04M9/08—Two-way loud-speaking telephone systems with means for conditioning the signal, e.g. for suppressing echoes for one or both directions of traffic
- H04M9/082—Two-way loud-speaking telephone systems with means for conditioning the signal, e.g. for suppressing echoes for one or both directions of traffic using echo cancellers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04B—TRANSMISSION
- H04B3/00—Line transmission systems
- H04B3/02—Details
- H04B3/20—Reducing echo effects or singing; Opening or closing transmitting path; Conditioning for transmission in one direction or the other
Landscapes
- Engineering & Computer Science (AREA)
- Signal Processing (AREA)
- Computer Networks & Wireless Communication (AREA)
- Cable Transmission Systems, Equalization Of Radio And Reduction Of Echo (AREA)
- Telephone Function (AREA)
- Interconnected Communication Systems, Intercoms, And Interphones (AREA)
Abstract
에코 억제기를 제어하기 위한 방법 및 장치는 감지된 신호의 질을 여러가지 조건 하에서 최적화 할 때 우수한 에코 감쇠 효과를 제공한다. 설명된 기술은 에코 억제기가 필요이상으로 감쇠를 생성하여 신호의 왜곡을 증가시킬 가능성을 최소화하도록 원하는 만큼의 에코 감쇠효과를 제공한다. 제1실시예에서, 음성 검출기가 멀리 떨어진 통신 신호에 음성 성분이 포함되어 있지 않다고 지시하면 음향 에코 억제기는 비활성화된다. 제2 실시예에서, 활성 음향 에코 소거기의 감쇠 계수는 음성 검출기가 가까운 통신 신호에 가까운 음성 성분이 있다고 지시하면 이에 기초하여 조절된다. 제3 실시예에서, 음향 에코 소거기에 의해 제공된 감쇠 레벨은 측정된 오디오 입력에서 음향 에코 소거기로의 음성 대 잡음 비율에 기초하여 조절된다.
Description
본 발명은 통신 시스템에 관한 것으로 보다 더 상세히 말하면 쌍방향 통신 링크(bi-directional communication link)에서의 에코 억제(echo suppression)에 관한 것이다.
지상통신선(landline)이나 무선 전화 시스템과 같은 여러 통신 시스템에서, 두 시스템 사용자들 사이의 음성 신호(voice signal)는 보통 쌍방향 통신 링크(bi-directional communication link)를 통해 전달된다. 이러한 시스템에서, 근단(near-end) 사용자의 음성(speech)는 일반적으로 통신 링크의 일단에서 근단 마이크로폰(microphone)으로 검출되어 링크를 통해 원단(far-end) 확성기 (loudspeaker)로 전달되어 재생(reproduction)되고 원단 사용자에게 주어진다. 역으로는, 원단 사용자의 음성이 원단 마이크로폰에 의해 검출되고 통신 링크를 통해 전송되어 근단 확성기에서 재생되어 근단 사용자에게 주어진다. 통신 링크의 각 말단에서, 근접한 마이크로폰에 의해 검출된 확성기의 출력은 원하지 않게 (inadvertently) 통신 링크로 되돌려져, 사용자에게 수용가능하지 않을 정도로 방해를 초래하는 피드백(feedback) 또는 에코를 발생시킨다.
그러므로 이러한 바람직하지 않은 에코 신호의 전달을 막기 위해, 마이크로폰 음향 입력은 가능한한 확성기로부터 분리되어 있어야 한다. 종래의 전화 핸드셋(handset)에서는 핸드셋 스피커(확성기)는 사용자 귀를 충분히 커버(cover)하고, 핸드셋 마이크로폰은 사용자 입과 가깝게 위치되어 있기 때문에 확성기와 마이크로폰이 충분히 분리될 수 있었다. 하지만, 휴대용 전화의 물리적인 크기가 줄어들고, 핸즈프리(hands-free) 스피커폰이 널리 퍼짐에 따라, 제조업체들은 디자인을 수정하여 확성기에서 마이크로폰으로의 음향 경로가 사용자의 머리나 몸에 의해 막히지 않도록 디자인하였다. 그 결과로, 좀 더 발달된 에코 억제 테크닉이 현대 시스템에서 매우 중요하게 되었다.
자동차용 핸즈프리 전화의 경우, 폐쇄된 자동차 환경에 의해 확성기 신호가 여러번 반사되어 고이득(high-gain) 핸즈프리 마이크로폰으로 다시 전달되어 버리기 때문에 이러한 태크닉에 대한 요구가 특히 크다. 창문을 열고 닫는다든지, 사용자가 운전하면서 머리를 움직인다든지 하는, 자동차 안에서의 사용자의 움직임 및에코 신호의 세기와 상대 이동의 변화는 자동차 환경에서의 에코 억제 작업을 더 복잡하게 만든다. 또한, 좀 더 최근에 개발된 디지털 전화는 음성 인코더(encoder)를 통해 음성 신호를 처리하는데, 이 인코더는 막대한 신호 지연(signal delay)를 초래하고 비선형적 신호 왜곡을 만들어낸다. 이러한 지연은 사용자 입장에서 보면 신호 에코 문제를 더 확대시키는 경향이 있고, 부가적인 비선형 왜곡으로 인해 네트워크 장비에서의 에코 억제가 더 어려워진다.
이러한 문제들에 대처하기 위해, 전화 제조업체들이 여러가지의 에코 억제 메카니즘(mechanism)을 개발했다. 예시적인 에코 억제 시스템(100)이 도 1a에 도시되어 있다. 도시된 바와 같이, 예로서의 시스템(100)은 마이크로폰(110), 확성기(120) 및 에코 억제기(130)를 가지고 있다. 마이크로폰(110)의 오디오 출력(115)은 에코 억제기(130)의 오디오 입력으로 연결되어 있고, 에코 억제기(130)의 오디오 출력(135)은 전화기(도시되지 않음)로의 근단 오디오 입력으로 사용된다. 또한, 전화기로부터의 원단 오디오 출력(125)은 확성기(120)로의 오디오 입력 및 에코 억제기(130)로의 참조 입력에 연결되어 있다.
동작을 살펴보면, 에코 억제기(130)가 마이크로폰 신호(115)를 처리하여 원단 전화 사용자에게 오디오 출력 신호(135)를 제공한다. 보다 더 상세히 말하면, 에코 억제기(130)가 원단 오디오 신호 (125)에 따라 마이크로폰 신호(115)를 감쇠하기 때문에, 확성기(120)에서 나와 마이크로폰(110)으로 들어가는 음향 에코가 원단 전화 사용자에게 다시 전달되지 않는다.
일반적으로, 에코 억제기(130)는 비선형 클립핑(clipping type)이거나, 선형 스케일링형(scaling type) 억제기이다. 클립핑 억제기는 일반적으로 특정 범위 내의 값을 가지는(즉, 특정 클립핑 윈도우(clipping window) 내의) 신호의 일부분을 버림으로서 마이크로폰 출력 신호(115)를 감쇠한다. 스케일링형 억제기는, 반면에, 신호에 적절한 스케일링 계수(scale factor)를 곱함으로써 마이크로폰 출력 신호(115)를 감쇠한다. 최근에 개발된 하이브리드(hybrid) 억제기는 예를 들어, 특정 감쇠 윈도우 내의 값을 가지는 마이크로폰 신호의 일부분을 스케일 하는 방식으로, 클립핑의 측면과 스케일링형의 측면을 결합한다. 어떤 경우든, 감쇠 레벨(level of attenuation)(즉, 클립핑 윈도우의 범위 및/또는 스케일링 계수의 크기)은 원단 오디오 신호(125)의 진폭(amplitude)에 따라 직접 혹은 간접적인 방법으로 조절되어, 마이크로폰 출력(115)이 원단 사용자의 음성 범위내로만(only to the extent the far-end user is speaking) 감쇠된다.
중앙 클립퍼(center clipper)라는 기술로 알려진 종래의 클립핑 억제기는, 예를 들어, Rasmusson 등에 의해 1995년 12월 12일에 발행된 미국 특허번호 5,475,731, 제목 "에코 추정을 사용하여 에러 신호를 수정하는 에코-소거 시스템 및 방법(Echo-Canceling System and Method Using Echo Estimate to Modify Error Signal)" 에 설명되어 있다. 또 다른 클립핑 억제기로는 1996년 12월 31일에 출원된 미국 특허출원번호(patent application number) 08/775,797, 제목 "통신 시스템에서 잡음 및 에코 억제를 위한 AC-중앙 클립퍼(AC-center clipper for Noise and Echo Suppression in a Communications Systems)" 가 있다. 전형적인 스케일링형 억제기로는 Genter로 1994년 2월 1일 발행된 미국 특허번호 5,283,784, 제목 "에코 소거 처리 테크닉 및 처리(Echo Canceller Processing Techniques and Processing)"가 있다. 본 문서에서는 AC-중앙 감쇠기(AC-center Attenuator)라고 명명되는, 좀 더 발달된 형태의 하이브리드 억제기로 미국 특허 출원 번호 09/005,149, 제목 "통신 시스템에서 진보된 에코 억제를 위한 방법 및 장치(Methods and Apparatus for Improved Echo Suppression in Communications Systems"가 있는데, 위의 특허와 특허출원(patent application) 전체를 참고로 첨부하였다.
도 1a의 억제기(130)는 선형 에코 소거기(canceler) 및/또는 듣기편한(comfort) 잡음 생성장치와 결합될 수 있는데, 이를 통해 좀 더 세련된 방식의 에코 억제 시스템을 제공할 수 있다. 도 1b는 도 1a의 마이크로폰(110), 확성기(120) 및 에코 억제기(130)와 음향 에코 소거기(140) 및 듣기편한 잡음 합산 장치(150)를 포함하는 예시적인 시스템(101)을 도시한다. 도시한 바와 같이, 마이크로폰의 출력(115)은 음향 에코 소거기의 오디오 입력으로 연결되고, 음향 에코 소거기(140)의 오디오 출력(145)는 에코 억제기(130)의 오디오 입력으로 연결된다. 억제기의 오디오 출력(135) 및 듣기편한 잡음 신호는 각각 합산 장치(150)의 제 1 및 제 2 입력으로 연결되고, 합산 장치(150)의 오디오 출력(155)은 전화기(도시되지 않음)의 근단 오디오 입력으로 제공된다. 전화기에서 나오는 원단 오디오 출력(125)은 확성기(120)의 오디오 입력, 음향 에코 소거기(140) 및 에코 억제기(130)의 참조 입력(reference input)으로 연결된다.
동작을 보면, 음향 에코 소거기(140)는 확성기(120)에서 마이크로폰(110)으로의 음향 경로(acoustic path)를 동적으로 모델링하여 마이크로폰 출력 신호(115)로부터 마이크로폰(110)에 의해 픽업된 임의의 확성기 사운드를 제거하려고 시도한다. 음향 에코 경로를 모델링하는 일반적인 알고리즘에는 잘 알려진 최소 제곱 평균(LMS, Least Mean Squares) 알고리즘과 그 변형인 정규 최소 제곱 평균(NLMS, Normalized Least Mean Squares) 알고리즘이 있다. 최소 제곱 평균알고리즘에 기초한 전형적인 예가 위에서 언급한 Rasmusson 등에게 출원된 미국 특허번호 5,475,731에 나와 있다. 또한, 진보된 정규 최소 제곱 합 알고리즘에 기초한 소거기가 본 문서에 참고로 첨부되어 있는데, 1997년 5월 7일에 제출된 미국 특허출원번호 08/852,729, 제목 "통신 시스템에서의 진보된 에코 소거기"에 설명되어 있다.
도 1b의 시스템(101)에서, 에코 억제기(130)가 에코 소거기(140)를 보충하여 필요할 때 부가적인 에코 감쇠를 제공한다. 예를 들어, 에코 억제기(130)는 음향 에코 소거기(140)에 의한 에코 소거의 순간적인 레벨(level)의 측정값에 기초하여 동적으로 조절되어, 잔류 에코를 미리 정해진 정도의 레벨까지 감쇠한다. 동적으로 에코 소거기에 의한 에코 소거정도를 측정하는 진보된 방법이, 예를 들어, 위에서 언급한 미국 특허출원번호 09/005,149(제목: "통신 시스템에서의 에코 억제를 위한 진보된 방법 및 장치")에 설명되어 있다.
도 1a의 시스템(100)에서, 에코 억제기(130)는 클립핑 억제기(clipping suppressor), 스케일링 억제기(scaling suppressor) 및 하이브리드 억제기(hybrid suppressor)가 될 수 있다. 또한, 에코 억제기(130)는, 에코 소거기(140) 다음에 나올 때는, 적절한 시간동안(예를 들어, 음성 검출기가 마이크로폰 신호(115)에 음성요소가 없다고 판정한 기간동안)에 오디오 출력 신호(135)를 선택적으로 잘라버리거나(cut out) 뮤트(mute)시키는 단순한 단투(single-throw) 스위치가 될 수도 있다. 어떤 경우든, 에코 억제기(130)는 에코를 억제하는 것과 함께, 전체 오디오 신호를 감쇠하고, 현존하는 배경 잡음 및/또는 근단 음성을 왜곡한다. 사실, 배경 잡음은 에코 억제기(130)가 활성화 되어 있을 때에, 원단 사용자가 전화가 끊긴 것으로 잘못 생각할 수 있을 정도까지 억제될 수 있다.
그러므로, 원단 사용자의 통화의 질을 높이기 위해, 요즘의 시스템들은 종종 에코 억제기(130)가 활성화 되어 있는 동안에는 전화 오디오 신호(135)에 듣기편한(comfort) 잡음을 추가한다. 도 1b의 시스템에서, 듣기편한 잡음이 합산 장치(150)를 통해 억제기 출력 신호(135)에 추가된다. 또 다른 방법으로, 합산 장치(150)을 스위치로 대체하여, 억제기 출력 신호(135)와 듣기편한 잡음 신호 중 하나만이 선택적으로 원단 사용자에게 전달되게 할 수도 있다. 듣기편한 잡음을 생성하고 사용하기 위한 진보된 방법이, 예를 들어, 본 문서에 참고로 전체 첨부된 미국 특허출원번호 09/005,145, 제목 "통신 시스템에서 듣기편한 잡음을 제공하기 위한 방법 및 장치(Methods and Apparatus for Providing Comfort Noise in Communications Systems)"가 있다.
위에서 기술된 시스템은 세련된 방식의 에코 억제를 제공하는 반면, 이러한 시스템을 제어하기 위한 알려진 방법들은 몇가지 측면에서 부적절하다. 예를 들어, 에코 억제기(130)를 제어하기 위한 알려진 방법들은, 원단 사용자로 하여금 받아들여질 수 없을 정도로 왜곡된 근단 음성을 지각하는 결과를 초래한다. 즉, 알려진 제어 방법들은 종종 에코 억제기(130)가 활성화되지 말아야 할 때(예를 들어, 근단 단일 토크(near-end single talk) 동안) 에코 억제기(130)를 활성화시키고 및/또는 (예를 들어 쌍방 토크(double talk) 동안) 필요하거나 바람직한 것보다 에코 억제기(130)가 근단 신호를 더 많이 감쇠한다. 또한, 잔류하는 에코 억제기를 제어하는(가령, 근단 음성이 있느냐 없느냐에 따라 전단(front-end)의 에코 소거기에 따라 나오는 단투 스위치를 닫거나 열는) 알려진 방법들은 종종 부적절한 에코 억제를 초래한다. 그러므로, 에코 억제기를 제어하기 위한 개선된 방법 및 장치가 필요하다.
도 1a은 본 발명의 지침이 구현될 수 있는 전형적인 에코 억제 시스템에 대한 도시.
도 1b는 볼 발명의 지침이 구현될 수 있는 전형적인 에코 억제 시스템에 대한 또 다른 실시예에 대한 도시.
도 2는 본 발명에 따른 에코 억제 시스템의 또 다른 방법의 시스템으로, 음향 에코 억제기로의 입력을 제어하도록 구성된 음성 검출기를 포함하는 시스템에 대한 도시.
도 3은 본 발명에 따른 에코 억제 시스템의 또 다른 방법의 시스템으로, 음향 에코 억제기의 감쇠 성분을 조절하도록 구성된 이득 제어 프로세서(gain control processor)를 포함하는 시스템에 대한 도시.
도 4는 에코 억제기를 제어하기 위한 본 발명에 따른 전형적인 단계에 대한 도시.
본 발명은 에코 억제기가 임의의 주어진 시간에 필요한 것보다 더 많은 감쇠, 따라서 더 많은 왜곡을 생성할 가능성(likelihood)을 최소화하면서 적절한 레벨의 에코 감쇠를 제공함으로써 에코 억제기를 제어하는 방법 및 장치를 제공하여 위에서 설명한 요구조건과 함께, 다른 요구조건들도 만족시킨다. 양호하게도, 본 발명의 방법 및 장치는 여러 조건 하에서 지각되는 신호의 품질을 최적화하면서 우수한 에코 억제를 제공하는 통신 시스템을 만들수 있도록 한다.
예시적인 제 1 실시예에서, 본 발명에 따른 에코 억제 장치는 제1 통신 신호(즉, 근단 오디오 신호)를 감쇠하도록 구성된 에코 억제기를 포함한다. 보다 더 상세히 말하면, 에코 억제기는 제1 통신 신호의 에코 성분을 억제하기 위해 제1 통신 신호를 감쇠한다. 여기서, 에코 성분은 제2 통신 신호(즉, 원단 오디오 신호)의 반사(reflection)로부터 기인한다. 예시적인 에코 억제기는 또한, 제2 통신 신호에 음성 성분이 포함되었는지를 지시하도록 구성된 음성 검출기를 포함하는데, 에코 억제기는 음성 검출기가 제2 통신 신호에 에코를 유발하는 음성 성분이 포함되어 있지 않다고 지시하면 비활성화된다. 그 결과로, 에코 억제기는 필요할 때만 활성화되어 제1 통신 신호에 왜곡을 가한다.
예시적인 제 2 실시예에서, 본 발명에 따른 에코 억제 장치는, 에코 성분을 억제하기 위해 제1 통신 신호의 일부분에 감쇠 성분을 곱하도록 구성된 에코 억제기를 포함하고, 여기서 이 에코 성분은 제2 통신 신호의 반사로 인해 생긴다. 예시적인 에코 억제기는 또한 통신 신호에서 우세한 조건을 검출하여 억제기의 감쇠 계수를 조절하도록 구성된 이득 제어 프로세서(gain control processor)를 포함한다. 예를 들어, 이득 제어 프로세서는 억제기의 감쇠 계수를 제1 통신 신호에 근단 음성 성분이 포함되어 있느냐에 따라 두 값중 하나의 값으로 설정할 수 있다. 그 결과, 예시적인 에코 억제기는 신호의 왜곡을 최소화하면서 적절한 레벨의 에코 감쇠를 제공할 수 있다.
예시적인 제 3 실시예에서, 본 발명에 따른 에코 억제 장치는 에코 성분을 억제하기 위해 제1 통신 신호를 감쇠하도록 구성된 에코 억제기를 포함하며, 여기서 이 에코성분은 제2 통신 신호의 반사에 의해 생긴다. 에코 억제 장치는 또한 제1 통신 신호의 음성 대 잡음 비율을 검출하여, 이 검출된 비율에 기초하여 에코 억제기에 의해 제공된 감쇠 레벨을 조절하도록 구성된 이득 제어 프로세서를 포함한다. 예를 들어, 이득 제어 프로세서는 이 비율이 소정의 임계치 이하이면 에코 억제기를 비활성화시킬 수 있다. 다른 방법으로, 이득 제어 프로세서는 에코 억제기의 감쇠 계수를 조절하여 에코 억제 장치의 출력에서의 에코 대 잡음 비율이 소정의된 임계치 아래의 값을 가지도록 할 수도 있다. 그 결과, 예시적인 에코 억제기는 신호의 왜곡을 최소화하면서, 전반적인 에코 감쇠의 적절한 레벨을 제공할 수 있다.
본 발명의 위에서 기술된 특징 및 다른 특징들을 이하로 첨부된 도면과 함레 설명된 실시예들과 함께 더 상세히 설명하도록 한다. 본 기술에 숙련된 자라면 기술된 실시예가 설명 및 이해를 위해 제공된 것이라는 것을 알 수 있고 여러 동일한 실시예를 예상할 수 있을 것이다.
도 2는 본 발명의 제 1 측면에 따라 구성된 에코 억제 시스템(200)을 도시한다. 도시한 바와 같이, 예시적인 시스템(200)은 도 1a와 도 1b의 마이크로폰(110), 확성기(120), 및 에코 억제기(echo suppressor)(130)와 확성기 음성 검출기(loudspeaker voice activity detector)(210)를 포함한다. 마이크로폰(110)의 오디오 출력(115)은 에코 억제기(130)의 오디오 입력으로 연결되고, 에코 억제기(130)의 오디오 출력(135)은 전화(도시되지 않음)로의 근단(near-end) 오디오 입력으로서 제공된다. 전화로부터 나오는 원단 오디오 출력(125)은 확성기(120)의 오디오 입력 및 에코 억제기(130)와 음향 검출기(210)로의 참조 입력으로 연결된다. 음성 검출기(210)의 이진 출력(215)은 에코 억제기(130)의 제어 입력으로 연결된다.
일반적으로, 도 2의 시스템(200)은 도 1a의 시스템(100)의 시스템과 유사하다. 바꿔 말하면, 에코 억제시스템(130)은 원단 오디오 신호(125)에 따라 마이크로폰(115)를 감쇠하여, 확성기(120)로부터 마이크로폰(110)으로의 음향 에코가 원단 전화 사용자에게로 다시 전달되지 않는다. 하지만, 도 2의 시스템에서, 에코 억제기(130)의 작동은 음성 검출기(215)의 이진 출력(215)에 의존한다. 보다 더 상세히 말하면, 에코 억제기(130)는 음성 검출기(210)가 원단 신호(125)에 음성 성분이 포함되어 있다고 나타낼 때(즉, 검출기 출력(215)이 1일때만)만 활성화된다.
음성 검출기 출력(215)에 따라 에코 억제기(130)의 활성화를 결정함으로써, 도 2의 시스템(200)은 필요하지 않을 때는 마이크로폰 신호(115)에 필요치않은 왜곡을 가하지 않는다. 다른 말로 말하면, 원단 사용자가 말하고 있지 않은 동안에는 원단 에코가 있을 수 없으므로, 원단 에코 억제기(130)는 활성화될 필요가 없다. 그러므로, 음성 검출기(210)가 원단 음성이 없다는 것을 지시할 때 에코 억제기(130)를 비활성화함으로써, 도 2의 시스템(200)은 원단 에코 억제가 불필요한 동안에 에코 억제기(130)가 근단 음성 및 잡음을 감쇠하여 왜곡할 가능성을 줄인다.
그러나, 확성기 음성 검출기(210)가 종종 잘못 판단할 수 있기 때문에, 원단 사용자가 말하고 있지 않을 때 항상 에코 억제기(130)가 활성화 되지 않는 것을 보장할 수는 없다. 그럼에도 불구하고, 억제기의 동작을 조절하지 않는 종래 기술의 시스템과 비교하면, 도 2의 시스템(200)은 양질의 원단 신호를 제공한다. 더 나아가, 도 2의 시스템은 마이크로폰 음성 검출기에 기초하여 억제기의 동작을 조절하는 종래 기술의 시스템과 비교하여 에코 억제기(130)에 의한 불필요한 감쇠를 우수하게 방지하는 효과를 제공한다. 확성기 신호는 일반적으로 마이크로폰 신호(가령, 자동차 핸즈프리 장치로부터의 신호)보다 방음 배경을 가지고 있기 때문에, 확성기 음성 검출기(210)가 마이크로폰 음성 검출기보다 일반적으로 더 믿을만하다. 다른 말로 말하면, 잡음이 많은 배경의 마이크로폰 신호에서 낮은 레벨의 음성요소를 검출해 내는 것 보다, 조용한 배경의 확성기 신호로부터 적은 양의 음성성분(lack of speech)을 검출해 내는 것이 더 쉽다.
위에서 이야기한 것들은 근단과 원단 사용자간의 네트워크 장치가 왕복 이득(round-trip gain)(즉, 원단 사용자에게서 발생된 신호 이득이 네트워크를 통과하여 원단 사용자에게로 되돌아가는것)이 단일단위보다 클 때의 주파수에서 생기는 하울링(howling)을 방지할 정도로 충분한 경우를 가정한다. 다른 말로 말하면, 만일 에코 억제기(130)가 원단 음성이 없음에 기초하여 완전하게 비활성화된다면, 다른 무언가(가령 네트워크 에코 소거기)가 하울링을 방지하기 위해 사용되어야 한다. 또 다른 방법으로는, 원단 음성이 없는 경우 에코 억제기(130)를 완전히 비활성화시키는 대신, 에코 억제기(130)가 활성화된 채로 남아 하울링을 방지할 정도로만 충분한 공칭 감쇠 레벨(-6~10dB)을 제공하도록 조절될 수 있다(클립핑, 스케일링형, 및 하이브리드 억제기의 경우).
본 발명의 기술분야에 숙련된 자라면 확성기 음성 검출기(210)를 구현하기 위한 방법이 공지되어 있음을 이해할 수 있을 것이다. 예를 들어, 유럽 전화통신 표준기구(European Telecommunications Standards Institute, ETSI)문서 GSM-06.82에 본 발명의 목표에 부합하는 구현방법이 설명되어 있다. 이러한 음성 검출기는 현재 많은 통신 시스템에서 잡음 억제 및/또는 불연속적인 전송(discontinuous transmission, DTX)을 목적으로 사용되고 있다. 일반적으로, 이러한 음성 검출기는 음성쪽으로 편향(bias)되어 있다. 다른 말로 말하면, 이 검출기는 종종 음성이 존재하지 않을 때 존재한다고 지시한다. 그러나, 음성이 존재할 때 존재하지 않는다고 지시하는 경우는 거의 없다. 본 발명의 확성기 음성 검출기(210)는 유사한 요구조건을 가지므로 (즉, 존재하지 않는 에코를 원단 사용자에게 재전달되도록 허용하는 것보다 에코를 허용하는 것 보다는, 존재하지 않는 에코를 감쇠시키려는 경향을 갖는 것이 바람직하다), 동일 유형의 음성 검출기가 도 2의 예시적인 실시예에서 사용될 수 있다.
도 1a 및 1b에 대한 위의 설명에서 이야기 한 것 처럼, 도 2의 에코 억제기(130)는 클립핑 억제기이거나 스케일링 억제기 또는 하이브리드 억제기, 또는 전단 에코 소거기(140)이 포함되는 경우의 절단(cut-off) 스위치일 수 있다. 그러므로, 억제기가 어떤 타입이냐에 따라, 원단 음성이 없는 주기동안에 에코 억제기(130)를 비활성화하는 다양한 방법이 구현될 수 있다. 예를 들어, 억제기를 전반적으로 우회하는 바이패스 스위치(bypass switch)를 사용함으로서 임의의 유형의 억제기를 효과적으로 비활성화 할 수 있다. 또 다른 방법으로, 절단 스위치 억제기는 단순히 스위치를 닫음으로써 비활성화할 수 있다. 클립핑 억제기는 클립핑 윈도우 사이즈를 0으로 설정함으로써 비활성화하거나 통과모드(pass-through mode)로 될 수 있다. 반면에, 스케일링 억제기의 경우는, 감쇠 계수를 1(unity)로 설정으로써 통과 모드로 될 수 있다. 또한, 하이브리드 억제기는 감쇠 윈도우를 0으로 설정하고/또는 감쇠 계수를 1로 설정함으로써 통과 모드로 될 수 있다.
도2의 실시예는 특히, 도 1b의 전단 에코 소거기(140)가 포함될 경우 잘 작동한다. 이것은, 음성 검출기(210)가 확성기 신호(125)에 음성성분이 존재하지 않는다고 잘못 지시하는 주기동안에, 에코 소거기(140)가 에코 억제기(130)의 도움 없이 일반적으로 충분한 에코 억제를 제공한다는 결과로부터 기인한다. 다른 말로 하면, 확성기 신호(125)가 비교적 잡음이 많고(그리고 원단 음성이 잡음으로 어느정도 마스킹되어 있고(masked)), 원단 사용자가 처음에 잡음으로 덮인 에코에 덜 민감할 때, 음성 검출기(210)가 이러한 에러를 범할 가능성이 크다. 하지만, 에코 소거기(140)가 포함되든 아니든, 도2의 시스템(200)은 고품질의 근단 신호를 제공한다.
도3은 본 발명의 또 다른 측면에 따라 구성된 다른 에코 억제 시스템(300)을 도시한다. 도시한 바와 같이, 전형적인 시스템(300)에는 도1a와 1b의 마이크로폰(110), 확성기(120), 에코 억제기(130), 에코 소거기(140) 및 합산 장치(150) 및, 이득 제어 프로세서(310)과 음량 이득 블록(320)을 포함한다. 마이크로폰 출력(115)은 음향 에코 소거기(140)의 입력과 이득 제어 프로세서(310)의 제 1 참조 입력으로 연결되어 있다. 음향 에코 소거기(140)의 오디오 출력(145)은 에코 억제기(130)의 오디오 입력과 이득 제어 프로세서(310)의 제 2 참조 입력으로 연결되어 있다. 억제기의 오디오 출력(135)과 듣기편한 잡음 신호는 합산 장치(150)의 제 1 및 제 2 입력으로 각각 연결되어 있다. 그리고 합산 장치(150)의 오디오 출력(155)는 전화기(도시되지 않음)로 들어가는 근단 오디오 입력으로 사용된다.
전화기에서 나오는 원단 오디오 출력(125)은 음량 이득 블록(320)의 오디오 입력으로 연결되어 있고, 음량 이득 블록(320)에서 나오는 오디오 출력(325)은 확성기(120)의 오디오 입력 및 에코 억제기(130)와 음향 에코 소거기(140)의 참조 입력으로 연결되어 있다. 음량 이득 블록(320)에서 나오는 오디오 출력(325)은 이득 제어 프로세서(310)의 제 3 참조 입력으로 연결되어 있고, 이득 제어 프로세서(310)의 제어 출력(315)은 에코 억제기(130)의 제어 입력으로 연결된다. 음량 제어 신호(324)는 이득 제어 프로세서(310)의 제 4 기준 입력과 음량 이득 블록(320)의 제어 입력에 연결된다.
일반적으로, 도3의 시스템(300)의 동작은 도1b의 시스템(101)의 동작과 유사하다. 다른 말로 하면, 음향 에코 소거기(140)는 확성기(120)에서 나와 마이크로폰(110)으로 들어가는 음향 경로를 동적으로 모델링하고, 마이크로폰(110)에 의해 픽업된 확성기 사운드는 소거하려고 한다. 그후, 에코 억제기(130)는 필요하다면 부가적인 에코 감쇠를 제공하고, 에코 억제기(130)에 의해 감쇠된 근단 잡음을 보상하기 위해 합산 장치(150)를 통해 듣기편한 잡음을 선택적으로 추가한다. 그러나, 도3의 시스템(300)에서는 이득 제어 프로세서(310)은 본 발명에 따라 에코 억제기(130)에 의해 제공된 감쇠의 레벨을 제어한다.
음량 이득 블록(320)은 도3의 시스템(300)에 포함되어 이득 제어 프로세서(310)의 작동을 더 잘 설명한다. 일반적으로, 음량 이득 블록(320)은 음량 제어 신호(324)에 따라 전화 오디오 신호(125)를 감쇠하고, 감쇠된 오디오 신호(325)를 확성기(120)로 전달한다. 음량 제어 신호(324)는 예를 들어, 근단 사용자에 의해 조절될 수 있다.
본 발명의 일면에 따라, 에코 억제기(130)는 스케일링 억제기이거나 하이브리드 억제기라고 가정하는데 이는 오디오 신호(145)의 적어도 일부에 감쇠 성분 α를 곱한다. 이 경우, 이득 제어 프로세서(310)는 음량 제어 신호(324)와 마이크로폰 신호(115), 확성기 신호(125) 및/또는 소거기 출력 신호(145)를 사용하여 제어 프로세서 출력 신호(315)를 통해 감쇠 계수 α를 제공한다.
구체적으로 말하면, 이득 제어 프로세서(310)는 참조 신호(115), (145), (324), (325)를 사용하여 억제기 감쇠 계수 α를 계산하는데 사용되는 루프나 왕복(round-trip), 에코 이득등을 동적으로 측정한다. 루프 이득은 전화 오디오 신호(125)의 원단 음성이 확성기(120)에서부터 마이크로폰(110)의 음향 경로를 통과하고 에코 소거기(140) 및 음량 제어 블록(320)을 통과할 때 어느정도로 감쇠가 되는지를 지시한다. 그러므로 루프 이득은 부가적인 감쇠의 양을 계산하는데 사용되고, 에코 억제기(130)는 근단 오디오 신호(135)의 에코값이 특정 목표 레벨까지 감쇠되는 것을 보장해야 한다.
음량 이득 블록(320)에 의해 제공된 감쇠의 레벨은 음량 제어 신호(324)를 통해 알 수 있다. 그러나, 음향 경로에 의해 제공되는 감쇠의 레벨(채널 이득이라고 불림) 및 에코 소거기(140)에 의해 제공되는 감쇠의 레벨(소거기 이득이라 불림)은 마이크로폰 신호(115), 확성기 신호(325) 및 소거기 출력 신호(145)에 기초하여 계산된다. 채널 이득과 소거기 이득을 계산하기 위한 개선된 방법이, 예를 들어, 위에서 언급한 미합중국 특허 출원, 번호 09/005,149(제목: "통신 시스템에서 에코 억제를 위한 개선된 방법 및 장치(Methods and Apparatus for Imprved Echo Suppression in Communications Systems")에 설명되어 있다. 채널 이득 및 소거기 이득을 계산하는 구체적인 방법을 언급하는 것은 본 발명을 이해하는 데에 그리 중요한 것이 아니므로 간략히 하기 위해 계산과정에 대한 자세한 설명은 생략한다.
위에서 설명한 대로, 이득 제어 프로세서(310)는, 음량 제어 블록(320)의 입력에서 에코 소거기(140)(또는 에코 소거기(140)가 포함되어 있지 않은 경우 마이크로폰(115))의 출력으로의 루프 이득이 주어지면, 억제기 감쇠 계수 α를 계산하여 근단 오디오 신호(155)에서의 에코가 특정 목표 레벨까지 억제되도록 한다. 그러나, 종래 기술의 시스템에서 이 목표레벨이 고정되어 있는 것에 반해, 도3의 시스템(300)의 이득 제어 프로세서(310)는 우세한 조건에 기초하여 이 목표 레벨을 조절함으로써, 에코 억제기(130)가 근단 오디오 신호(155)상의 왜곡을 최소화한다.
다른 말로 하면, 종래 기술의 시스템은 일반적으로 목표 레벨을 강제적인 고정된 값(즉, 근단 배경 잡음이 없이 원단 단일 음성의 경우와 같은 단일 최악 경우에서 정해진 값)으로 정하여 강제적인 목표 레벨이 필요치 않는 경우 필요 이상으로(즉, 최악의 경우가 아닌 경우) 근단 신호(155)를 왜곡하는 반면, 도3의 이득 제어 프로세서(310)는 몇가지 가능한 목표 레벨값 중에 하나를 동적으로 선택하는데, 목표 레벨의 가능한 각 값은 현재 우세한 조건에 가장 적합한 것이다. 예를 들어, 원단 단일 토크의 주기 동안에는, 원단 사용자가 에코에 상당히 민감하기 때문에, 목표 레벨이 상당히 엄격해야 한다 (-45dB이하). 그러나, 쌍방 통화의 경우는 원단 사용자가 에코에 덜 민감하기 때문에 목표 레벨이 어느정도 완화된다(-25dB이하). 양호하게도, 이득 제어 프로세서(310)는 이러한 조건 및 다른 우세한 조건을 검출할 수 있기 때문에, 이에 따라 목표 레벨을 정한다(이를 통해 억제기 감쇠 계수 α를 정한다). 그 결과로 도3의 시스템(300)은 주어진 시간에 근단 신호(155)에 필요 이상으로 왜곡을 가하지 않는다.
근단 단일 토크인지, 원단 단일 토크인지, 쌍방 토크인지, 근단의 잡음이 많은지 등의 조건을 검출하기 위해, 이득 제어 프로세서(310)는 마이크로폰 신호(115), 확성기 신호(325) 및/또는 소거기 출력 신호(145)를 사용한다. 예를 들어, 원단 음성을 검출하기 위해서, 이득 제어 프로세서(310)는 도2와 함께 위에서 설명된 확성기 음성 검출기(210)를 포함시킬 수 있다. 또한, 이득 제어 프로세서(310)는 마이크로폰 음성 검출기를 포함하여, 마이크로폰 신호(115) 및/또는 소거기 출력 신호(145)에 기초하여 근단 음성을 검출할 수 있다.
본 기술에 숙달된 자라면 마이크로폰 신호(115)에만 기초한 마이크로폰 음성 검출기를 구현하는 방법이 공지된 것임을 이해할 수 있을 것이다. 또한, 에코 소거기의 입출력에 기초하여(즉, 마이크로폰 신호(115)와 소거기 출력(145)에 기초하여) 근단 음성을 검출하는 개선된 방법은 아래에서 의사코드(pseudo-code)로 설명한다. 근단 음성 검출에 관한 구체적인 설명은 본 발명을 이해하는 데 중요한 것이 아니므로 이러한 자세한 설명은 여기서는 생략한다.
위에서 설명한 목표 레벨 선택 프로세스가 에코 억제기(130)이 활동하고 있어 오디오 신호(145)를 어느정도 레벨까지 감쇠하는 데(즉, 에코 억제기(130)가 상술한 바와 같이 바이패스되거나 통과 모드에 놓이지 않을때)에 응용할 수 있다는 것을 아는 것은 중요하다. 그러므로, 본 발명은 근단 음성이 검출될 때(즉, 쌍방 토크동안에) 에코 억제기(130)를 완전히 비활성화 하여 근단 신호에 대한 왜곡을 방지하는 시스템과 구분된다. 이러한 시스템은 에코 억제기(130)가 비활성화 될 경우 에코 소거기(140)에만 의존하여 충분한 에코 억제를 제공하기 때문에, 이러한 시스템은 요즘의 전화 표준(즉, IS-55A에서 추천하는 표준으로, 원단 단일 토크에서는 -45dB의 에코 감쇠, 쌍방 토크에서는 025dB의 에코 감쇠)을 만족시키지 못한다.
반대로, 본 발명은 에코 억제기(130)가 쌍방 토크의 경우에도 활성화상태로 있는 것을 허용하여 모든 시간에 이 요구조건을 만족시킬 수 있다. 원단 단일 토크 및 쌍방 토크에서 각각 요구되는 조건인 -56dB과 -25dB의 에코 억제 목표를 사용하는 것은 에코 억제를 최대로 하고 근단 신호 왜곡을 최소로 하는 상충되는 요구조건 사이의 밸런스를 잘 맞춘다는 실험결과가 있다. 본 기술에 숙련된 자라면 두가지 우세한 조건에(원단 단일 토크 및 쌍방 토크)에 따르는 목표 레벨이 제공되더라도, 다른 일반적인 상황(근단 및 원단 잡음 레벨이 높거나 낮은 경우)도 고려하여 부가적인 목표 레벨을 제공하는 것을 생각해야 한다는 것을 알 수 있다.
본 발명의 다른 측면에 따라, 도3의 이득 제어 프로세서(310)는 억제기 입력 신호(145) 내의 에코 대 잡음 비율에 대한 측정값에 기초하여 에코 억제기(130)를 통제한다. 구체적으로 말하면, 이득 제어 프로세서(310)는 억제기 입력(145)의 에코 대 잡음 비율을 동적으로 측정하여, 프로세서 출력 신호(315)를 통해 적절한 제어 신호를 에코 억제기(130)에 제공한다.
실시예에서, 이득 제어 프로세서(310)는, 측정된 에코 대 잡음 비율이 소정의 임계치보다 작으면 에코 억제기(130)를 비활성화시킨다. 다른 말로 하면, 에코가 효과적으로 감춰졌을 때 또는 배경 잡음에 의해 덮혔을 때, 원단 사용자는 에코를 감지할 수 없으므로 에코 억제기(130)는 에코를 더 억제하기 위해 근단 신호 왜곡을 가할 필요가 없는 것이다. 그러므로, 에코 억제기(130)는 비활성화되거나 하울링을 방지할 정도로만 충분한 공칭 감쇠 레벨을 제공하도록 조절될 수 있다.
실험에서, -10dB또는 그 이하의 에코 대 잡음 비율은 원단 사용자의 입장에서는 잡음을 충분히 가릴 수 있다는 것을 알 수 있다. 그러나, 에코 소거기(130)를 비활성화하기 위한 잡음 마스킹 임계치(echo masking threshold)는 실제적으로 -10dB보다 낮게 설정되어, 에코 대 잡음 비율 계산의 오차로 인해 인지될 정도의 에코를 전달해 버리는 것을 막는다. 실험적으로, 이러한 목적을 위해서는 이 잡음 마스킹 임계치를 -18dB로 잡는 것이 효과적이라는 것을 보였다.
위에서 설명된 대로, 에코 억제기(130)는 다양한 방법으로 비활성화 될 수 있다. 예를 들어, 임의의 유형의 에코 억제기(130)는 바이패스 스위치(bypass switch)를 사용하여 효과적으로 비활성화 할 수 있고, 절단 스위치(cut-off switch) 억제기는 이 절단 스위치를 닫음으로써 비활성화될 수 있다. 또한, 클립핑 억제기는 클립핑 윈도우 사이즈를 0으로 줄임으로써 비활성화될 수 있고, 스케일링 억제기는 억제기 감쇠 계수를 1로 설정함으로써 비활성화될 수 있다. 하이브리드 억제기는 클립핑 윈도우를 0으로 및/또는 억제기 감쇠 계수를 1로 설정함으로써 비활성화될 수 있다.
에코 억제기(130)는 스케일링 억제기이거나 하이브리드 억제기(즉, 에코 억제기가 억제기 입력 신호의 일부분에 감쇠 계수 α를 곱하는 장치)인 경우, 에코 대 잡음 비율 측정에 위에서 설명한 루프 이득 개념을 결합하여 추가적인 장점을 얻을 수 있다. 예를 들어, 본 발명의 실시예에서, 이득 제어 프로세서(310)는 위에서 설명한 것 처럼 음량 이득 블록(320)의 입력에서부터 에코 억제기(130)의 입력으로의 루프 이득을 계산하고, 그후, 배경 잡음의 에코를 마스킹하기 위한 억제기 감쇠 계수 α(즉, 예를 들어, -18dB의 에코 대 잡음 비율을 갖는 오디오 출력에서 발생될 감쇠 계수 α)를 계산한다. 에코 억제기(130)가 전체 오디오 신호(145)(에코 및 음성, 잡음 포함)를 감쇠하기 때문에, 본 실시예는 에코 억제기(130)에서 제거된 배경 잡음을 보상하기 위해 억제기 출력신호(135)에 듣기편한 잡음을 추가하는 것으로 가정한다.
실시예에 따라, 오디오 입력에서 에코 억제기(130)로의 에코 대 잡음 비율은 오디오 입력에서의 전체 에너지를 측정하고, 오디오 입력의 잡음 에너지의 레벨을 추정함으로써 계산된다. 구체적으로 말하면, 잡음 에너지 추정값을 전체 에너지 측정값으로부터 빼서, 남은 차이(이것이 에코 에너지를 나타낸다)값을 잡음 에너지 추정값으로 나누어, 에코 대 잡음 비율 추정값을 계산해 낸다. 이 기술에 숙련된 자라면, 신호에서의 에너지 값을 측정하고 신호 내의 잡음 레벨을 추정하는 방법이 공지되어 있음을 이해할 것이다. 또한, 잡음 레벨 추정값을 계산하기 위한 개선된 방법이 의사코드로 아래에 나와 있다. 잡음 레벨 추정과 관련된 구체적인 설명은 본 발명을 이해하는 데 중요한 요소는 아니므로 더 자세한 것은 여기서는 생략한다.
양호하게도, 위에서 설명된 본 발명의 모든 측면들은, 단일 에코 억제 시스템 내로 결합되어 좀 더 세련된 에코 억제 제어 및 근단 신호의 적절한 품질을 제공한다. 이 점을 설명하기 위해, 도4는 본 발명의 여러 측면을 사용하여 에코 억제기(130)의 감쇠 계수 α가 조절되는 과정에 대한 알고리즘을 도시하고 있다. 알고리즘 (400)은 루프 이득(loop gain)의 개념을 사용하기 때문에, 알고리즘 (400)은 기본적으로 스케일링 억제기와 하이브리드 억제기에 적용될 수 있다. 본 기술에 숙달된 자라면, 알고리즘(400)의 특정 일면이 위에서 설명한 모든 유형의 억제기에 적용될 수 있다는 것을 알 수 있을 것이다.
도시한 바와 같이, 알고리즘(400)은 S10단계에서 시작하여, S20단계에서 확성기 음성 검출기(210)가 원단 음성이 있다고 지시하였는지를 판정한다. 만일 없다면, 에코 억제기(130)는 통과(pass through)모드에 놓여 프로세서가 S60단계에서 종료된다. 그러나, 만일 확성기 음성 검출기(210)가 원단 음성이 있다고 지시할 경우에는, S30단계에서 근단 음성이 또한 검출되었는지를 결정한다.
만일 근단 음성이 검출되지 않는다면, 소정의 원단 단일 토크 목표를 달성하기 위하여 필요한 감쇠 계수가 S35단계에서 계산된다. 그러나 만일 근단 음성이 검출되면, 소정의 쌍방 토크 목표를 달성하기 위하여 필요한 감쇠 계수가 S40단계에서 계산된다. 각 경우에, S45단계에서 소정의 잡음 마스킹 목표(noise masking goal)를 달성하기 위하여 필요한 감쇠 계수가 계산된다. 그 후에 S60단계에서 감쇠 계수 α는 S45 단계에서의 잡음 마스킹, S40 또는 S35 단계에서의 음성 검출에 기초하여 계산된 감쇠 계수 중 가장 덜 엄격한(stringent)값으로 설정된다. 그후, S60단계에서 프로세스가 종료된다.
도4의 알고리즘(400)의 실시예는 다음 의사코드에 의해 제공된다. 의사코드에서는 스케일링 또는 하이브리드 에코 억제기가 감쇠 또는 이득 계수인 echoSuppressorGain을 사용하여 동작하는 것으로 가정하고 있다.
if farEndVoiceFlag == 0,
echoSuppressorGain = 1;
else,
if nearEndVoiceFlag == 1,
loopEchoGainGoal = -25dB
else,
loopEchoGainGoal = -56dB
end
echoSuppressorGain = ...
max(loopEchoGainGoal / loopEchoGain, ...
echoToNoiseGoal/echoToNoise)
end
도4의 알고리즘을 보면, S45 단계에서의 잡음 마스킹 목표는 S30에서 근단 음성이 검출되었는지에 따라 계산된다. 그러나, 실제로는 실험적으로, 전단의 에코 소거기(140)가 포함되어 있을 경우에는, 전형적인 쌍방 토크 목표(-25dB)에 기초하여 계산된 감쇠 계수 α가 전형적인 잡음 마스킹 목표(-18dB)에 기초하여 계산된 감쇠 계수보다 항상 큰 (따라서, 왜곡이 적은) 것으로 나타난다. 그러므로, 쌍방 토크가 검출되었을 경우에 잡음 마스킹 목표를 위한 감쇠 계수 α의계산을 생략함으로써 DSP싸이클이 실제로는 줄여질 수 있다.
도4의 알고리즘(400)은 또한, 억제기 입력의 에코 대 잡음 비율이 이미 잡음 마스킹 목표치보다 아래에 있을 경우에는 에코 억제기(130)를 비활성화하지 않는다. 이것은, 실험에 의하면 스케일링 및 하이브리드 억제기의 경우, 에코 억제기(130)를 활성화 한 채로 두는 것이(여기서 감쇠 성분 α는 잡음 덮음 목표에 따라 계산된 것임) 부정확한 에코 및 잡음 추정치(즉, 에코 대 잡음 비율 자체를 계산하는 데 사용되는 추정치)로 인해 오차(인지할 수 있을 정도의)가 잘못 전달되는 것을 막는 데에 더 바람직한 것으로 밝혀졌다.
컴퓨터 시뮬레이션을 통해, 본 발명의 사상에 입각하여 구성된 에코 억제 시스템이 월등하게 근단 음성의 왜곡을 줄이고 비선형 에코 억제기에 의해 발생하는 배경 잡음을 줄인다는 것이 밝혀졌다. 예를 들어, 확성기 음성 검출기(210)가 원단 음성이 없다고 나타낼 경우에 에코 억제기(130)를 비활성화하는 것은 원단 단일 토크 조건하에서 근단 음성 및 잡음이 왜곡되지 않는 완벽한 결과를 나타냈다. 확성기 신호에 일정한 잡음이 있을 경우에도 성립한다.
추가로, 근단 음성이 검출되는지에 기초하여 활성 에코 억제기의 에코 억제 목표를 조정하는 것은, 쌍방 토크의 조건하에서 근단 음성 및 잡음의 측면에서 매우 좋은 성과를 보였다(또한, 음량 제어, 음향 에코 경로 및 선형 에코 소거기의 결합된 이득이 -25dB 또는 그보다 더 좋은 경우 - 이는 일반적인 경우이다 - 근단 음성 및 잡음의 측면에서 완벽한 결과를 보였다.) 활성 에코 억제기의 에코 억제 목표치를 조정하는 것은 또한, 근단 단일 토크의 조건하에서, 확성기의 음성 검출기(210)이 음성을 잡음으로 잘못 검출하는 경우, 근단 음성 및 잡음을 개선한다.
더 나아가, 억제기 입력에서 에코 대 잡음 비율 측정치에 기초하여 에코 억제기를 제어하는 것은, 잡음이 많은 차 안의 환경에서, 근단 음성 및 잡음을 개선한다. 예를 들어, 원단 단일 토크의 경우, 근단 배경 잡음의 감쇠가 줄어들었다. 그 결과로, 원단 사용자를 위한 듣기편한 잡음을 덜 추가해도 되게 되었고, 원단 사용자에게 인지되는 배경 잡음의 특성 역시 더 잘 보존되었다. 또한, 쌍방 토크나 근단 단일 토크의 경우에도, 양쪽의 확성기 음성 검출기(210) 및 근단 음성 검출기가 잘못 동작했을 경우라도, 근단 음성나 잡음이 개선된다. 그러므로, 근단 잡음(즉, 자동차 핸즈프리 전화기의 경우에 들리는 길이나 교통 소음등)이 많은 근단 단일 토크의 경우, 본 발명은 확성기에 상수 잡음이 있음에도 불구하고, 근단 음성 및 잡음의 왜곡을 확실히 줄이는 세가지 메카니즘을 제공한다.
예를 들어, 도4의 알고리즘(400)에 대한 또다른 실시예(실제 에코 억제 시스템과 결합된 경우)가 아래에 의사코드로 설명되었다. 의사코드는 32비트 디지털 신호 프로세서를 사용하여 구현된 예시적인 에코 억제 시스템을 시뮬레이트하도록 기입된다. 본 기술에 숙달된 자라면, 이러한 코드가 본질적으로 매우 전형적인 것이며, 하드웨어 구성에 따라 여러 방법으로 구현될 수 있음을 알 수 있다. 전형적인 에코 억제 시스템에는 위에서 언급한 미합중국 특허 출원 번호 08/852,729에서 설명된 개선된 에코 소거기의 수정 버전과, 미 합중국 특허 출원번호(_____)(제목:"통신 시스템에서 개선된 에코 억제를 위한 방법 및 장치(Methods and Apparatus for Improved Echo Suppression in Communications Systems)"에 설명된 AC-중앙 감쇠기가 포함되어 있다.
% MATLAB을 위한 AEC 및 ANLP 시뮬레이션 스크립트
% 이 스크립트를 실행하기 전에, 다음 변수의 값들을 세팅하시오
% inFile = 입력파일 이름, 좌(left) = 원단, 우(right) = 근단.
% outFile = 출력파일 이름, 좌(left) = ANLP 출력, 우(right) = AEC 출력
%모든 파일은 DAT-Link의 원 포맷(raw format)을 사용한다.
%estnoise.m는 잡음을 추정하기 위한 함수를 포함한다.
%용어
%EC = 에코 소거기(Echo Canceler) = 선형 에코 억제기(linear echo suppresser)
%AEC = 음향-에코 소거기(Acoustic-Echo Canceler) = 확성기-에코 소거기(loudspeaker-echo canceler)
%NLP = 비선형 프로세스(Non-Linear Process) = 잔류-에코 억제기(residual-echo suppressor) = AC-중앙 감쇠기(AC-center attenuator)
%ANLP = 음향 비선형 프로세스(Acoustic Non-Linear Process)
%VAD = 음성 검출기(Voice-Activity Detector)
%최대 양수 값을 분수로 나타낸 값
ONE = 32767/32768;
%원단 및 근단 신호를 담고 있는 파일을 읽는다.
fidIn = fopen(inFile, 'r');
if fidIn == -1
error(['Error opening file' inFile])
end
[LRmatrix, wordCount] = fread(fidIn, [2, inf], 'int16');
fclose(fidIn);
%갱신된 합계(integration)주기에서의 표본의 개수
FRAME_SIZE = 160;
%프레임 사이즈가 클 수록 쌍방(double-speech)-토크 및 근단(near-end) 잡음에 대한 안정성(robustness)이 크다.
%잡음은 그 합이 0으로 수렴하는 경향을 가진다.
%프레임 사이즈가 크면 수렴을 검출하는 능력도 증가된다. 왜냐하면, 비상관 잡음은 프레임 사이즈의 제곱근에 비례해서 커지는 반면 상관(correlated) 갱신(update)은 프레임사이즈와 비례해서 커지기 때문이다.
%프레임 사이즈가 작으면 변화(에코 경로, 단일->쌍방 토크)에 대한 대응시간이 짧아지고, 수렴의 속도를 빠르게 한다.
%프레임 사이즈가 작으면 또한, 모음 소리를 거부하는 능력을 증진시킨다.
%160을 사용한 이유는 프레임당 160개의 표본이 들어가는(160-samples-per-frame) TDMA전화로 포팅(porting)하기 쉽게 하기 위해서이다.
%결과적으로 나오는 20ms 프레임은 음성성분을 정적-신호 세그먼트(stationary-signal segments)로 나눌 때 거의 최적이다.
NFRAMES = floor((wordCount/2)/FRAME_SIZE); %처리할 프레임 개수
clear wordCount
NSAMPLES = NFRAMES*FRAME_SIZE; %디버그(debug)를 위한 표본-기초 벡터(sample-based vector)의 길이
%
%mic(송신) 및 스피커(수신) VAD 출력을 각각의 파일에서 로드한다. 각 파일이 없으면, 근단 및 원단 실행가능 C파일을 실행하여, 접두사(prefix)가 같은 파일에 VAD 출력을 저장한다.
%
fidIn = fopen([inFile '_up_vad'], 'r');
if fidIn == -1
disp(['File = inFile '_up_vad not found -- creating ...'])
삭제
fidOut = fopen('vad_in.raw', 'w');
fwrite(fidOut, LRmatrix(2,:), 'int16'); %송신 오디오
fclose(fidOut);
!nrsim -s=f vad_in.raw junk vad_out.bit
!rm vad_in.raw
!rm junk.flt
fidIn = fopen('vad_out.but', 'r');
if fidIn == -1
error('Error opening file = vad_out.bit')
end
micVad = fread(fidIn, NFRAMES, 'int8');
!rm vad_out.bit
fclose(fidIn); fidOut = fopen ([inFile '_up_vad'], 'w'); fwrite (fidOut, micVad, 'int8'); fclose (fidOut);
else
micVad = fread(fidIn, NFRAMES, 'int8');
fclose(fidIn);
end
fidIn = fopen([inFile '_down_vad'], 'r');
if fidIn == -1
disp(['File=' inFile '_down_vad not found -- creating ...'])
fidOut = fopen('vad_in.raw', 'w');
fwrite(fidOut, LRmatrix(1, :), 'int16'); %수신 오디오
fclose(fidOut);
!nrsim -s=f vad_in.raw junk vad_out.bit
!rm vad_in.raw
!rm junk.flt
fidIn = fopen('vad_out.bit', 'r');
if fidIn == -1
error('Error opening file = vad_out.bit')
end
speakerVad = fread(fidIn, NFRAMES, 'int8');
!rm vad_out.bit
fclose(fidIn);
fidOut = fopen([iFile '_down_vad'], 'w');
fwrite(fidOut, speakerVad, 'int8');
fclose(fidOut);
else
speakerVad = fread(fidIn, NFRAMES, 'int8');
fclose(fidIn);
end
%입력을 -1에서 0까지로 스케일한다.
LRmatrix = LRmatrix / 32768;
%표본 프레임에 대해 누적된 오른쪽 쉬프트 값으로의 비트의 개수(Number of bits to right shift values accumulated over a frame of samples)
FRAME_BITS = ceil(log2(FRAME_SIZE));
%에너지를 32비트로 정량화(quantize)하기 위해 계수를 스케일한다.(Z8.23 포맷)
w/FRAME_SIZE = 160;
ENERGY_SCALE = 2^(31-FRAME_BITS);
%참조 지연 라인의 탭(taps)의 개수
%고-지연 탭(tabs)이 대부분 원단 신호와 비상관되고 근단 에너지만을 포함하기에 충분하게 길어야 한다.
AEC_REF_TAPS = 512;
%FIR 에코-추정 필터의 탭의 개수
AEC_COEF_TAPS = 256;
%근단 에너지 측정을 위한 갱신 벡터의 고-지연 섹션(section)의 탭의 개수
AEC_NEAR_TAPS = 128;
%자동차 잡음 표본의 포획을 위한 벡터의 길이
COMFORT_NOISE_SIZE = 128;
%최대 갱신 이득(gain)을 결정하기 위해 갱신 벡터의 최고-대-바닥(peak-to-baseline)비율의 임계치를 계산한다. [-1,1]사이에서 고르게 분포하는(uniform) 잡음의 경우, 갱신 크기(update magnitude)의 최고치의 기대값은 g*FRAME_SIZE/3이다. 그리고, 비상관 탭의 갱신 벡터의 RMS의 기대값은 g*sqrt(FRAME_SIZE)/3이다. 이 때, g는 에코 경로 이득값이다. 그러므로 최대 갱신 벡터의 최고-대-바닥 비율은 sqrt(FRAME_SIZE)이다.
%그러나, 음성은 잡음처럼 일정한 포락선(envelope)을 가지지 않는다. FRAME_SIZE가 갱신 벡터의 길이보다 훨씬 작기 때문에, 순간적인(burst) 음성은 종종, 최고치가 측정되는 갱신 벡터 영역내에는 있으나 바닥값이 측정되는 영역내에는 있지 않을 것이다. 그러므로, 실제 최고-대-바닥값 비율은 매우 클 수 있다.(>300).
%임계치를 너무 낮게 잡으면, 잡음이 있거나 쌍방 토크의 상황에서의 저 에너지 원단 신호에 대해서도 고-이득(high-gain) 갱신으로 인해 불안정한 상태를 유발할 수 있다.
%임계치를 너무 높게 잡으면, 에코-경로가 크게 변한 후의 고 에너지 원단 신호에 대해서만 갱신이 일어나므로, 적응(adaptation)이 매우 느려진다.
%실제 상황에서는 이 임계치는 양쪽을 타협해서 실험적으로 결정된다.
AEC_MAX_GAIN_THRESH = 16;
%잡음의 최고-대-RMS값은 프레임 사이즈와 무관하다. 근단 음성/잡음 및 원단의 주기적 신호를 거부하는 임계치는 실험적으로 구했다.
AEC_BASELINE_THRESH = 5.5;
%상태 게이지(status gauge)에 대한 승수(multiplier)로 사용되는 미리 계산된 상수
AEC_STATUS_GAUGE_SCALER = floor(32768 … (AEC_MAX_GAIN_THRESH-AEC_BASELINE_THRESH))/32768;
%FIR 계수(coefficient)를 위한 이득 프로파일(gain profile)을 생성한다.
%이 프로파일은 대략 자동차의 계수 범위의 기대치와 같다.
%이에 따라, 주기적 성분(모음)을 포함하는 갱신은 강제적으로, 적절한 지수감소(exponential decay) 특성을 따르도록 되고, 발산(divergence)을 최소화한다. 고-지연 탭의 저 이득(lower gain) 역시 계수에 대한 갱신된 잡음의 영향을 줄인다.
%프로파일의 전반적인 영향으로 인해, 불안한 상태를 초래하지 않고 고 갱신 이득을 가능하게 한다.
%모든 계수는 동적인 범위 내의 16비트의 숫자이므로, 고-지연 탭은 역시 이 프로파일의 결과로서 더 잘 정량화된다. 프로파일은 우 쉬프트 간에서의(with a right shift in between)시간에서 FIR 64 taps를 계산함으로서 구현할 수 있다.
profile = ones(AEC_COEF)TAPS, 1);
for k=2:(AEC_COEF_TAPS/64),
profile((k*64-63):(k*64))=ones(64,1)*2^(1-k);
end
%실행을 빠르게 하기 위해 디버그 벡터에 메모리를 할당한다.
aecUpdateFactor = zeros(1,NFRAMES);
aecChangeGainHist = zeros(1,NFRAMES);
aecSpeedHist = zeros(1,NFRAMES);
aecVoiceGainHist = zeros(1,NFRAMES);
aecVoiceGainBaseHist = zeros(1,NFRAMES);
aecNearRatioHist= zeros(1,NFRAMES);
aecNearGainHist = zeros(1,NFRAMES);
aecEchoGainHist = zeros(1,NFRAMES);
aecInNoiseHist = zeros(1,NFRAMES);
aecInEchoNoiseHist = zeros(1,NFRAMES);
aecInVoiceHist = zeros(1,NFRAMES);
aecInEchoVoiceHist = zeros(1,NFRAMES);
anlpInVoiceHist = zeros(1,NFRAMES);
anlpInNoiseHist = zeros(1,NFRAMES);
anlpDeltaHist = zeros(1,NFRAMES);
anlpGainHist = zeros(1,NFRAMES);
%변수 초기화
aecRef = zeros(1,AEC_REF_TAPS); %마지막에 사용함
values:
aecCoef = zeros(AEC_COEF_TAPS,1); %주석처리하시오
this
aecInNoise = FRAME_SIZE; %주석처리하시오
this
aecInEchoNoise = aecInNoise; %주석처리하시오
this
anlpInNoise = aecInNoise; %주석처리하시오
this
aecChanGain = ONE; %주석처리하시오
this
aecVoiceGain = ONE; %주석처리하시오
this
aecVoiceGainBase = aecVoiceGain; %주석처리하시오
this
aecNearGain = aecVoiceGain; %주석처리하시오
this
aecEchoGain = aecVoiceGain; %주석처리하시오
this
anlpComfortNoiseInOld = 0; %주석처리하시오
this
anlpComfortNoiseOutOld = 0; %주석처리하시오
this
anlpComfortNoise = zeros(1,COMFORT_NOISE_SIZE); %주석처리하시오
this
anlpArCoef = 0.75;
thisaecNearRatio = 0; %단지 기록을 위한 목적
aecInNoiseStateVars = [aecInNoise 0 0];
aecInEchoNoiseStateVars = [aecInEchoNoise 0 0];
anlpInNoiseStateVars = [anlpInNoise 0 0];
anlpSpeed = 1;
anlpArGain = 1-anlpArCoef;
anlpRefEnvelope = 0;
anlpOutLast = 0;
anlpNearSpeechCount = 0;
anlpNearSpeechFlag = 0;
%disp(['aecCoef(1) = ' dec2hex(aecCoef(1)*32768+(aecCoef(1)<0)*65536)])
%disp(['aecCoef(2) = ' dec2hex(aecCoef(2)*32768+(aecCoef(2)<0)*65536)])
%disp(['aecInNoise = ' dec2hex(aecInNoise*2^31)])
%disp(['anlpInNoise = ' dec2hex(anlpInNoise*2^31)])
%disp(['aecChanGain = ' dec2hex(aecChanGain*32768)])
%disp(['aecVoiceGain = ' dec2hex(aecVoiceGain*32768)])
삭제
%disp(['aecVoiceGainBase = ' dec2hex(aecVoiceGainBase*32768)])
%disp(['aecEchoGain = ' dec2hex(aecEchoGain*32768)])%disp(['anlpComfortNoiseInold = 'dec2hex(anlpComfortNoiseInold *32768)])
%disp(['anlpComfortNoiseOutOld = ' dec2hex(anlpComfortNoiseOutOld*32768)])
%disp(['anlpArCoef = ' dec2hex(anlpArCoef*2^31)])
%disp(['anlpArGain = ' dec2hex(anlpArGain*32768)])
fidOut = fopen(outFile, 'w');
for frame=1:NFRAMES,
frame %진행상황 지시를 위해 프래임 번호를 디스플레이한다
%
%AEC 전-프레임(pre-frame) 섹션
%
%FIR 계수 갱신을 위한 참조벡터의 탭과 근단 에너지의 계수에 사용되는 참조벡터 사이에는 차이가 있기 때문에, 참조 벡터의 매 탭마다 갱신벡터를 계산할 필요는 없다. 그러므로, 갱신 벡터는 두 목적을 위해 특별히 서브 벡터의 형태로 표현된다.
%프레임에 따라 누적되는 갱신 서브벡터를 초기화함(clear)
aecUpdate = zeros(AEC_COEF_TAPS, 1); %FIR 계수 갱신에 사용됨
aecUpdateNear = zeros(AEC_NEAR_TAPS, 1); %근단 측정을 위해 사용됨
%다른 어큐뮬레이터(accumulator)를 초기화함
aecEchoEstEnergy = 0;
%블록-소수점(block-floating-point)변수를 리셋(reset)
aecShiftPending = 0;
aecErrorShift = 0;
%송신 및 수신 PCM 오디오 표본을 받아 버퍼에 넣는다.
downlinkAudio = LRmatrix(1, (frame-1)*FRAME_SIZE+1:frame*FRAME_SIZE);
uplinkAudio = LRmatrix(2, (frame-1)*FRAME_SIZE+1:frame*FRAME_SIZE);
%AEC 근단입력 에너지를 프레임에 따라 누적한다.
aecInEnergy = sum(uplinkAudio .^2);
%에너지를 32비트로 정량화한다.
aecInEnergy = floor(aecInEnergy*ENERGY_SCALE)/ENERGY_SCALE;
%
%AEC 표본 섹션
%
for k=1:FRAME_SIZE,
%원단(확성기)표본을 참조 지연 라인으로 쉬프트시키고
%FIR 출력을 계산한다.
%DSP에서, 양쪽 작동은 한 명령으로 이루어진다.
aecRef = [downlinkAudio(k) aecRef(1:AEC_REF_TAPS-1)];
%테스트 코드 시작
%다음 코드는 주석처리된, 비트-정확 코드(bit-accurate code)를 빠르게 추정한다.
aecEchoEst = aecRef(1:AEC_COEF_TAPS)*(aecCoef.*profile);
aecEchoEst = max(min(round(aecEchoEst*32768)/32768,ONE),-1);
%테스트 코드 끝
% aecEchoEst = 0;
% for m=(AEC_COEF_TAPS/64):-1:2,
% aecEchoEst = aecEchoEst + aecRef(m*64-63:m*64)*aecCoef(m*64-63:m*64);
% aecEchoEst = max(min(aecEchoEst,ONE),-1)/2;
% % S.31포맷으로 정량화한다
% aecEchoEst = floor(aecEchoEst *2^31)/2^31;
% end
% aecEchoEst = aecEchoEst+aecRef(1:64)*aecCoef(1:64);
% aecEchoEst = max(min(aecEchoEst,ONE),-1);
% % S.15포맷으로 정량화한다.
% % 0.5의 소수로 음수를 반올림할 때, 1의 보수 소수점이 2의 보수와 같이 동작하도록 하기 위해 2^(-17)을 더한다.
% aecEchoEst = round(aecEchoEst*32768+2^(-17))/32768;
% aecEchoEst = max(min(aecEchoEst, ONE),-1);
%프레임에 따라 에코-추정 에너지를 누적한다.
%작은 신호에 대한 성능을 높이고, 다른 에너지 누적 방법과 같은 방법으로 측정하기 위해, 전(full) 40비트 어큐뮬레이터(accumulator)가 루프를 돌면서 저장된다.
aecEchoEstEnergy = aecEchoEstEnergy + aecEchoEst^2;
%AEC출력값을 다음과 같이 계산한다. AEC output = near-end(microphone)input - echo estimate.
uplinkAudio(k) = max(min(uplinkAudio(k)-aecEchoEst,ONE),-1);
%계수 갱신을 누적한다. coef update = correlation of error(uplinkAudio(k)) and reference.
%블록 소수점 표현법을 사용한다. 이 때 aecErrorShirt는 지수이고, aecUpdate/aecUpdateNear()는 가수이다.
T = uplinkAudio(k)*2^aecErrorShift;
% S.15 포맷으로 정량화한다. T = floor(T*32768)/32768; if aecShiftPending,
ASM = -1;
aecErrorShift = aecErrorShift - 1;
aecShiftPending = 0;
else
ASM = 0;
end
%FIR계수 갱신에 사용되는 영역을 계산한다.
aecUpdate = aecUpdate + T*aecRef(1:AEC_COEF_TAPS)';
%근단 에너지 측정에 사용되는 영역을 계산한다.
aecUpdateNear = aecUpdateNear + … T*aecRef(AEC_REF_TAPS-AEC_NEAR_TAPS+1:AEC_REF_TAPS)';
%S.15포맷으로 정량화한다.
%0.5의 소수로 음수를 반올림할 때, 1의 보수 소수점이 2의 보수와 같이 동작하도록 하기 위해 2^(-17)을 더한다.
aecUpdate = round(aecUpdate*32768+2^(-17))/32768;
aecUpdateNear = round(aecUpdateNear*32768+2^(-17))/32768;
aecUpdate = max(min(aecUpdate, ONE),-1);
aecUpdateNear = max(min(aecUpdateNear, ONE),-1);
aecUpdate = aecUpdate*2^ASM;
aecUpdateNear = aecUpdateNear*2^ASM;
%가능한 우쉬프트(right shift)후에 S.15포맷으로 정량화한다.
aecUpdate = floor(aecUpdate*32768)/32768;
aecUpdateNear = floor(aecUpdateNear*32768)/32768;
%갱신 벡터의 최고 제곱값을 찾는다 (첫 128 탭에서 가정한다)
%목표는 최고 절대값을 구하는 것이다. 하지만, 최고 제곱값이 DSP에서는, 프레임의 마지막에서의 제곱값을 가지고도, 더 적은 싸이클을 취한다.
aecUpdatePeak2 = max(aecUpdate(1:128).^2);
%다음 루프에서 갱신값을 2로 나눠야 할 필요가 있을 때는 지시자를 플래그 해 둔다(flag indicates).
aecShiftPending = aecUpdatePeak2 > 0.25; %0.25 = 0.5^2
end
%에너지를 32비트로 정량화한다
aecEchoEstEnergy = floor(aecEchoEstEnergy*ENERGY_SCALE)/ENERGY_SCALE;
%
% AEC 후-프레임(post-frame) 섹션
%
aecOut = uplinkAudio; %디버그를 위해 출력을 파일로 저장한다.
%AEC-출력 에너지를 프레임에 따라 누적한다.
aecOutEnergy = sum(uplinkAudio.^2);
%에너지를 32비트로 정량화한다
aecOutEstEnergy = floor(aecOutEstEnergy*ENERGY_SCALE)/ENERGY_SCALE;
%실제 참조 에너지값은 갱신 벡터의 각 요소(element)마다 다르다. aecUpdate(1)은 aecRef(1)로부터의 에너지값을 사용할 것이고, aecUpdate(2)는 aecRef(2)로부터의 에너지를 사용할 것이고,.. 등이다. 복잡도를 줄이기 위해, 참조 에너지를 표현하기 위해 하나의 번호만을 사용한다.
%너무 작은 값을 사용하여, 적응 속도를 결정하거나 갱신값을 정규화(NLMS)하기 위해, 채널 에코 이득을 측정하는 데에 참조 에너지를 사용할 경우, 불안한 상태를 유발할 수 있다.
%여기서 구현된 적절한 해결책은 profile=1에서 말단점(endpoints)의 최대값을 사용하는 것이다.
aecRefEnergy = max(sum(aecRef(1:FRAME_SIZE).^2), … sum(aecRef(64:FRAME_SIZE+63).^2));
%Z8.7포맷으로 정량화한다.
aecRefEnergy = floor(aecRefEnergy*128)/128;
%오차와 원단 신호 사이의 상관(correlation)이 0이라고 기대될 때, 갱신 바닥값을 고-지연 요소의 RMS로서 측정한다.
%정량화 후에 aecUpdateBase값이 보다 크고 aecPeakToBase 보다 작도록 보장하기 위해 결과에 1 LSB를 더한다. 이렇게 하면 고 에코 상관의 영향을 없앨 수 있다.
%내림 연산 후에 1 LSB를 더함으로서 모든 잘려나간 비트가 0인 경우만 제외하고(이 경우는 매우 드물다) 올림 연산과 같은 결과를 얻는다.aecUpdateBase = sum (aecUpdateNear .^2)/AEC_NEAR_TAPS;제곱근 중간 결과를 Z.31 포맷으로 정량화한다.
aecUpdateBase = floor(aecUpdateBase*2^31)/2^31;
aecUpdateBase = sqrt(aecUpdateBase);
%Z.15포맷으로 정량화한다
aecUpdateBase = floor(aecUpdateBase*32768+1)/32768;
%갱신 벡터의 최고 크기를 찾는다.
aecUpdatePeak = sqrt(aecUpdatePeak2);
%갱신된 최고-대-바닥 비율을 계산한다.
aecPeakToBase = aecUpdatePeak/aecUpdateBase;
%4자리 소수 비트로 충분하므로 Z11.4포맷으로 정량화한다.
aecPeakToBase = floor(aecPeakToBase*16)/16;
%상태 게이지(범위=[0,ONE])를 갱신 최고-대-바닥 비율로부터 계산한다.
%이 게이지는, 수신스트림 프로세싱에 사용되는 것으로, 프레임 사이즈와 바닥 임계치가 변하여 최고-대-바닥 비율이 변하더라고 같게 유지된다.
%근단 음성/잡음 또는 원단 주기적 신호(모음)에 대해 게이지<0.1
% 예를 들어, 주파수가 941Hz 와 1209Hz일 때, DTMF 톤(tone)의 첫 프레임을 찾아 aecPeakToBase=3.5를 생성하고, 이로 인해 aecStatusGauge=0이 된다.
%쌍방 토크의 경우, 게이지<0.3;
%원단 단일 토크의 경우
% gauge=ONE, 잡음에 상관없이 소거기가 모두 포함되지 않았을 때.
% 만일 근단이 조용하면, 거의 수렴할 때 까지 gauge=ONE
% 소거기가 수렴하면, 에너지가 근단 잡음 레벨보다 큰 잔류 에코만이 gauge=ONE이도록 한다.
% 그러므로, 근단 잡음은 갱신을 조금만 일으키고, 갱신 이득은 줄이지 않는다.
aecStatusGauge = (aecPeakToBase-AEC_BASELINE_THRESH)* … AEC_STATUS_GAUGE_SCALER;
aecStatusGauge = max(min(aecStatusGauge,ONE),0);
%Z.15포맷으로 정량화한다.
aecStatusGauge = floor(aecStatusGauge*32768)/32768;
%AEC입력에서 잡음 프레임 에너지를 추정한다.
[confirmedNoVoiceFlag, aecInNoiseStateVars] = estnoise(aecInEnergy, … (micVad(frame)==0)&(aecStatusGauge==0),aecInNoiseStateVars);
aecInNoise=aecIOnNoiseStateVars(1);
aecInNoise %상태를 보기 위해 디스플레이한다.
aecInNoiseHist(frame)=aecInNoise; %디버그를 위해 저장해둔다.
%AEC 입력(체널 이득)에서 에코 이득을 추정한다.
%원단 단일 토크의 경우만 추정치를 갱신한다
%(speakerVad(frame)==1) & (aecStatusGauge>0.3), AEC 입력 측정값에는 음성(aecInVoice>aecInNoise*8)만 들어있는 반면 참조 측정값에는 음성과 잡음이 들어있더라도 비율이 정확한 경우, 또한, 참조 에너지가 정량화에 의해 크게 영향을 받지 않은 경우(aecRefEnergy>=10/128)
%순간적인 이득 측정값은 매우 정확하지는 않은데, 이는 시간이 잘못 배열되있거나(misalignment) 스펙트럼이 변화하기 때문이다.
%그러므로, 평균을 내는 프로세스가 필요하다.
%에코 소거기 필터 계수의 기준(norm)은 체널 이득에 대한 우수한 장기(long-term) 추정값이다. 그러나, 이것은 에코 경로의 변화를 추분히 빨리 따라가지는 못한다. 또한, 채널 이득 추정값에 따라 선형 에코 소거기의 속도를 조절하기 때문에, 추정값이 선형 에코 소거기로부터 독립적일수록 안정성이 증가된다. 그러므로 다음과 같은 스킴(scheme)이 사용된다.
%순간 추정치(aecChanGainTrial)이 추정치(aecChanGain)보다 작으면, 추정치를 지수적으로 감소시킨다.
%속도 적응을 위하여, 오차가 50%보다 크면 추정치는 순간 추정치로 직접적으로 정해지고, 오차가 12.5%보다 크면 추정치는 비율적으로 낮춰진다. 즉,
%(aecChanGain-aecChanGainTrial)/4>aecChanGain/32 for (aecChanGain-aecChanGainTrial>aecChanGain/8=aecChanGain*0.125.
%순간 추정치가 추정치보다 크면, 추정치가 근단 음성에 의해 명확히 지배되지 않는 경우(aecChanGainTrial<2)에만, 추정치를 지수적으로 증가시킨다.
%(aecChanGainTrial<2*aecChanGain)과 같은 상대적 비교를 사용하는 것은 효과가 없다. 왜냐하면, 실제 채널 이득이 빨리 증가할 때(jump)는 갱신이 일어나지 않기 때문이다.
%증가시킬때의 시간 상수(pump-up time contant)를 감소시킬때의 시간상수(jump-down constant)의 1/8로 하는 것은 순간 추정치에서의 근단 음성을 허용(tolerate)하는 데 도움을 준다.
%근단 음성과 체널 에코 이득이 악화될 때 사이를 구분하는 것은 어려운 일이다.
%여기서는 증가시킬 때의 시간 상수에 따라 추적 비율(tracking rate)를 결정한다. 그리고, 이것은 실험적으로 결정된 것이다.
aecInVoice = max(0, aecInEnergy-aecInNoise);
aecInVoiceHist(frame) = aeInVoice;
if(speakerVad(frame)==1) & (aecStatusGauge>0.3) & ...
(aecInVoice>aecInNoise*8) & (aecRefEnergy>=10/128),
%aecInVoice을 4Z8.20포맷으로 정량화하여 제수(devidend)가 몫(quotient)에 대한 원하는 스케일을 얻을 수 있도록 한다.
aecChanGainTrial = floor(aecInVoice*2^20)/2^20/aecRefEnergy;
%한계 몫을 Z2.13포맷으로 정량화한다.
aecChanGainTrial = min(4*ONE, floor(aecChanGainTrial *2^13)/2^13);
%몫의 제곱근을 계산한다.
aecChanGainTrial = sqrt(aecChanGainTrial);
%제곱근을 Z1.14포맷으로 정량화한다.
aecChanGainTrial = floor(aecChanGainTrial *2^14)/2^14;
if(aecChanGainTrial<aecChanGain/2),
aecChanGain = aecChanGainTrial;
elseif (aecChanGain>aecChanGainTrial),
aecChanGain = aecChanGain - … max((aecChanGain-aecChanGainTrial)/4, aecChanGain/32);
elseif(aecChanGainTrial<2*ONE)
aecChanGain = min(ONE, aecChanGain+max(aecChanGain/256, 2^(-11)));
end
%Z.15포맷으로 정량화한다.
aecChanGain = floor(aecChanGain*32768)/32768;
%디버그를 위해 저장해 둔다.
aecChanGainHist(frame) = aecChanGainTrial;
else
aecChanGainHist(frame) = ONE;
end
aecChanGain %상태를 보이기 위해 디스플레이한다.
aecSpeedHist(frame) = aecChanGain %디버그를 위해 저장해 둔다
%갱신 이득을 결정한다
%이득이 ONE보다 작거나 같은 한, 적응 속도 상수(원단 신호 진폭에 독립적임)를 만들기 위해 NLMS를 사용한다.
%max함수를 사용하면 분모에 1을 더하는 것 보다 수렴속도가 빠른데, 이는 결과 이득값이 더 크기 때문이다.
%근단 잡음 및/또는 음성이 있을 때는, AEC 참조값 및 근단입력 에너지를 사용하는 것은, 이득을 정규화하는데 제약을 가한다.
%AEC근단 입력 에너지 값을 사용하는 대신 AEC출력 에너지 값을 사용하지 않는데, 이는 수렴 후에는 더 높은 이득이 필요치 않으며, AEC 갱신 이득값을 제어하기 위해 AEC출력에 기초한 다른 파라미터(parameter)를 사용하지 않는 것이 안정성을 제공하기 때문이다.
%마이크로폰에 오버로드(overload)가 걸리는 것을 피하기 위해, aecInEnergy는 근단 음성 또는 잡음과 함께 aecRefEnergy보다 작아야 한다.(왜냐하면 마이크로폰 이득은 제일 큰 근단 음성 레벨에 따라 설정되기 때문이다.)
%근단의 작은 잡음과 함께 원단 단일 토크가 있다고 확신할 수 있으면 에너지에 곱하는 값은 8로 설정된다. (aecInEnergy/16>=aecOutEnergy)
%그렇지 않으면, 16으로 결정된다. 그러므로 적응은 자동차 안이 조용할 때 더 빠르다.
%에너지에 곱하는 값이 너무 작으면 안정성이 떨어져서, 적응에 오버슈터(overshoot)가 발생하고 에코 소거기 출력값에 스파이크(spike)가 생기게 된다.
%적응 오버슈트는 또한 에코 경로가 변화할 때의 원단 단일 토크와 근단 음성 사이의 차이가 생기는 것을 방해한다.
%에너지에 곱하는 값이 너무 크면, 진동(perturbation) 바로 후에 에코 이득이 증가한다.
%분자(numerator)에서는, 조건에 따라 이득이 달라지게 하는 게이지를 사용한다. 또한 채널로의 적응 속도를 최적화하기 위해 채널 에코 이득을 곱하는 값으로 사용한다.
%이 곱하는 값(multiplier)없이는 고 채널 이득의 경우 적응이 원하는 것보다 느려지거나 저 채널 이득의 경우 불안정해지게 된다.
%에너지 값에 기초한 채널 이득을 사용하는 대신 적응 필터 계수의 기준값을 사용하면, 장기간적인 관점에서는 더 정확하고 일정한 추정을 할 수 있으나, 단기적인 관점에서는 에코 경로가 변화한 후에 속도와 안정성에 대한 타협을 봐야 한다.
if(aecInEnergy/16>=aecOutEnergy)
aecDenon = max(1,8*max(aecRefEnergy, aecInEnergy));
%디버그를 위해 성분값을 게이지의 음수값과 같게 설정한다
aecUpdateFactor(frame) = -aecStatusGauge;
else
aecDenom = max(1,16*max(aecRefEnergy,aecInEnergy));
%디버그를 위해 계수를 게이지 값과 같게 설정한다.
aecUpdateFactor(frame) = aecStatusGauge;
end
%Z12.3포맷으로 정량화한다.
aecDenom = floor(8*aecDenom)/8;
aecNumber = aecChanGain*aecStatusGauge;
%22Z.18포맷으로 정량화한다.
aecNumber = floor(aecNumber *2^18)/2^18;
aecUpdateGain = min(aecNumber/aecDenom, ONE);
%Z.15포맷으로 정량화한다.
aecUpdateGain = floor(aecUpdateGain*32768)/32768
%적응적 이득을 이용하여 갱신 벡터를 계수 벡터로 더한다.
%FIR 계수로 사용하기 전에 aecCoef에 프로파일을 곱한다.
aefCoef = aecCoef + (aecUpdate * 2^(-aecErrorShift) * aecUpdateGain);
%S.15포맷으로 정량화한다.
%0.5의 소수로 음수를 반올림할 때, 1의 보수 소수점이 2의 보수와 같이 동작하도록 하기 위해 2^(-17)을 더한다.
aecCoef = round(aecCoef * 32768 * 2^(-17))/32768;
aecCoef = max(min(aecCoef,ONE),-1);
%잡음 억제기가 여기서부터 동작하여 송신오디오를 처리한다.
%하나의 서브루틴내에서만 aecUpdate와 aecUpdateNear를 사용하면, 오버레이(overlay)를 위해 사용할 수 있도록 임시 메모리에 저장될 수 있다.
%
%ANLP 전-프레임(pre-frame) 섹션
%
%ANLP입력에서 에너지를 누적하는데 이 때 ANLP입력은 잡음 억제기를 통하여 AEC출력으로 연결된다.
%
anlpInEnergy = sum(uplinkAudio .^2);
%에너지를 32비트로 정량화한다
anlpInEnergy = floor(anlpEnergy*ENERGY_SCALE)/ENERGY_SCALE;
%ANLP입력에서 잡음 프레임 에너지값을 추정한다.
%에코 추정값이 확성기 신호로 나온 다음부터 speakerVad를 이용한다.
[confirmedNoVoiceFlag, aecInNoiseStateVars] = estnoise(anlpInEnergy, …(micVad(frame)==0)&(aecStatusGauge==0),anlpInNoiseStateVars);
anlpInNoise=anlpIOnNoiseStateVars(1);
anlpInNoiseHist(frame) = anlpInNoise; %디버그를 위해 저장해 둔다
%어떤 음성도 확정되지(confirm) 않았을 때, 듣기편한 잡음을 계산한다.
if confirmedNoVoiceFlag,
anlpComfortNoise = iplinkAudio(1:COMFORT_NOISE_SIZE);
%NLMS알고리즘을 사용하여 일차 다음과 같은 형태의 ARMA 잡음 모델에서 anlpArCoef를 추정한다.
% (1-anlpArCoef)*(1 + 0.8125*Z^-1)/(1-anlpArCoef*Z^-1).
%이 ARMA모델은 백색 잡음(white noise)를 필터하여 자동차 잡음처럼 들리는 잡음을 만들어 내는 데 이용된다.
%NLMS알고리즘을 통해 다음 수식을 최소화한다.
% error = uplinkAudio * (1-anlpArCoef*Z^-1)/(1+ 0.8125*Z^-1).
%오차와 uplinkAudio*Z^-1간의 상관계수는 계수 추정치로 갱신된다.
%anlpInEnergy는 갱신 이득을 정규화하여, 레벨치에 상관 없는 적응비율을 제공하는데 사용된다.
%MIPS를 저장하기 위해 루프 밖에서 0이 아닌 분모를 계산한다.
anlpDenom = 4 * max(1/128, floor(anlpInEnergy*128)/128);
error = 0;
for i=2:FRAME_SIZE,
error = -0.8125 * error;
%5S4.31포맷으로 정량화한다 (최대는 10*uplinkAudio)
error = floor(error * 2^31)/2^31;
error = error + uplinkAudio(i-1:i) * [-anlpArCoef;1];
quotient = uplinkAudio(i-1:i-1) * floor(error * 2^12)/2^12 / anlpDenom;
quotient = max(min(quotient, ONE), -1);
%S.15포맷으로 정량화한다
quotient = floor(quotient * 32768) / 32768;
anlpArCoef = anlpArCoef +quotient;
anlpArCoef = max(min(anlpArCoef,ONE),-1);
end
anlpArGain = 1 - anlpArCoef;
%디버그를 위해 듣기편한 잡음의 주파수 반응을 플로팅(plotting)한다.
% plot((0:8191)/8191*4000,...
% 20*log10(abs(freqz(anlpArGain*[1 0.8125], [1-anlpArCoef], 8192))))
% axis([0 4000 -40 10])
% pause(1)
end
%AEC입력에서 에코의 잡음 프레임 에너지를 추정한다.
%에코 추정치가 확성기 신호에서 나오므로, speakerVad를 사용한다.
[confirmedNoVoiceFlag, aecInNoiseStateVars] = estnoise( …aecEchoEnergy, (micVad(frame)==0)&(aecStatusGauge==0), …aecInEchoNoiseStateVars);
aecInEchoNoise(frame)=aecInEchoNoiseStateVars(1);
aecInEchoNoiseHist(frame)=aecInEchoNoise; %디버그를 위해 저장한다.
Test1Hist(frame)=aecInEchoNoiseStateVars(2); %디버그를 위해 저장한다.
Test2Hist(frame)=aecInEchoNoiseStateVars(3); %디버그를 위해 저장한다.
aecInEchoNoiseStateVars %상태를 보기 위해 출력한다.
%음성 에너지 추정값을 추정한다. 0보다 작아지지 않도록 한다.
aecInEchoVoice = max(0, aecEchoEstEnergy - aecInEchoVoice);
aecInEchoVoiceHist(frame) = aecInEchoVoice;
aecNearVoice = max(0, aecInVoice - aecInEchoVoice);
anlpInVoice = max(0, anlpInEnergy - anlpInNoise);
anlpInVoiceHist(frame) = anlpInVoice;
%선형 에코 소거기의 바닥 에코-이득 추정치를 상향으로 흘려보낸다.
%이를 근단 음성을 검출하기 위한 순간 에코 이득값과 비교하는 데와, 근단 음성 동안의 ANLP이득값에 사용된다.
%순간 에코 이득이 나빠질 때, 추적할 수 있을 정도로 빨리 상향으로 흘려보낸다.
%흘려보냄(leakage)은 에코 경로가 바뀔 때 원단 단일 토크 동안에 근단 음성을 잘못 검출하는 것을 막기 위한 빠른 추적(tracking)과, 원단 음성/잡음이 있는 동안의 근단 음성/잡음의 왜곡을 최소화 하는 것과 타협점에서 경험적으로 결정된다.
%에코 경로가 변한 후에 원단 단일 음성이 시작될 때,
%aecNearGain이 낮아지고, 얼마정도 높아졌다가 다시 낮아질 수 있다.
%만일, aecNearGain이 aecVoiceGainBase보다 충분히 커지면, 근단 음성이 검출된다.
%이렇게 되면, 이를 방지하기 위해 aecVoiceGainBase의 흘려보냄(leakage)이 증가될 수 있다.
%흘려보냄 상수는 5/4096으로, 충분한 추적 속도를 위해 경험적으로 결정되었다.
%그러나, 흘려보냄이 증가되면 쌍방 토크동안에는 근단 음성의 검출정도가 낮아진다.
aecVoiceGainBase = min(aecVoiceGainVase + 1/8192, ONE);
%선형 에코 소거기의, 채널이득을 제외시킨 음성 이득을 측정한다.
%채널 이득을 포함시키면 근단 음성 검출이 어려워 질 수 있다.
%선형 에코 소거기의 입출력에서의 음성 에너지의 비율의 제곱근(root)을 계산한다.
%이러한 직접적인(raw) 측정값은 음성이 근단에서 오든 원단에서 오든 양쪽에서 오든지에 무관하다.
%선형 에코 소거기의 출력이 ANLP입력에서 취득된다. 왜냐하면, 신호는 잡음 억제기를 통과하여 측정값이 더 정확해 지기 때문이다.
%에너지 측정값에는 크로스 상관하지 않는 에코에서의 확성기 왜곡이 포함한다.
%에코 소거기의 입출력에서의 에너지 값은 또한, 에코 소거기 출력을 참조값과 비교할 때 발생되는 시간-정렬(time-alignment, 채널의 지연때문에 발생하는 것)이 없다.
%이득은, 정량화에 의해 값이 변하지 않았을 때(aecInVoce>8/2^7)와, 음성이 존재할 때(aecInVoice>aecInNoise*8), 그리고 잔류 에코값을 측정할 수 있을 때(anlpInVoice>anlpInNoise/2)만 측정한다.
%측정값의 정확도는 원단 신호의 주기적 성분에 의해 감소하지는 않는다.
if(aecInVoice>max(8/2^7m aecInNoise*8)) & ...
(anlpInVoice>anlpInNoise/2),
aecVoiceGain = min(ONE, sqrt(anlpInVoice/(floor(aecInVoice*2^7)/2^7)));
%Z.15포맷으로 정량화한다.
aecVoiceGain = floor(aecVoiceGain*32768)/32768;
%근단 음성의 전체 음성에 대한 비율을 측정한다.
%이 값은 에코 추정치의 에너지값에만 의존하고 출력에서 에코가 얼마나 잘 소거되었는지에는 의존하지 않기 때문에, 이 값에는 원단 단일 토크의 경우 에코 경로가 바뀜에 따른 지시(indication)가 잘못되는 경우가 별로 없다.
%그러나, aecVoiceGain과 같이, 근단음성에 대한 잘못된 지시는 소거기가 전반적으로 훈련되지 않았을 경우에 많이 일어난다.
%일반적으로 이 비율값에는 제곱근값이 포함되는데, 이는 음성 측정값이 에너지 단위이기 때문이다.
%그러나, 에너지 비율을 직접적으로 사용하면, 근단 음성과 소거기의 미숙한 훈련 사이의 차이가 커질 수 있다.
%이것으로 MIPS를 단축시킬 수 있다.
aecNearRatio = min(ONE, aecNearVoce/(floor(aecInVoice*2^7)/2^7));
%Z.15포맷으로 정량화한다.
aecNearRatio = floor(aecNearRatio*32768)/32768;
%원단 음성이 있는 동안에, 선형 에코 소거기의 바닥 에코 이득 추정치를 측정한다.
%원단 단일 토크가 에코 이득(잡음이 아닌)을 추적할 수 있을 정도로 파라미터값이 확실한 정도로 존재할 때(aecStausGauge>0.1)면 항상 이 값을 측정한다.
%그렇지 않으면, 에코가 들릴 수 있다.
%음성 이득이 바닥 측정치보다 작으면 바닥 에코 이득 측정치를 갱신한다. 왜냐하면, 이는 원단 단일 토크일 가능성이 높다는 것을 나타내기 때문이다.
%흘려보냄을 이용하되 바닥값보다 음성 이득이 높은 경우에는 바닥값이 음성 이득을 추적하지 않도록 하면, 바닥값은 잡음 및 근단 음성에 대해 안정성(robust)이 크다.
if(aecStatusGauge>0.1)
aecVoiceGainBase - min(aecVoiceGainBase, aecVoiceGain);
end
%근단 음성 동안에는 선형 에코 소거기의 음성을 측정하고, 원단 단일 토크 동안에는 이를 리셋한다(음성 이득의 최고치를 취한다).
%이는, 쌍방 토크를 검출하기 위한 음성 이득 바닥값과 비교하는 데에 사용된다.
%그 근단 음성이 있다고 지시하는 것은 에코 소거기의 게이지가 낮고(aecStatusGauge<0.3), 에코 소거기 출력에 음성이 잔류 에코와 같지 않을 정도(anlpInVoice<anlpInNoise*8)로 충분한 에너지를 포함하는 경우를 말한다.
%원단 음성의 경우에는 게이지가 주기적 성분으로 인해 낮을 수 있다는 것을 상기하라.
%그러므로, 에코 경로의 변화로 인해 음성 이득이 갑자기 악화되는 경우와 근단 음성이 있어서 확성기 왜곡이 생기는 경우를 구분할 또다른 방법이 필요하다.
%원단 단일 음성의 경우 음성 이득이 갑자기 악화되는 경우에는 그 주기가 짧은 경향이 있다. 그러므로, 이 파라미터가 증가하는 경우를 필터링하면, 원단 단일 토크의 경우를 거부할 수 있다.
%이 필터 시간 상수는 원단 단일 토크와 쌍방 토크 인지 속도간의 타협점에서 경험적으로 결정된다.
aecNearGainLast = aecNearGain;
aecNearGain = min(aecNEarGain, AecVoiceGain);
if(aecStatusGauge<0.3) & (anlpInVoice>anlpInNoise*8),
aecNearGain = aecNearGain + (aecVoiceGain-aecNearGain)/8;
%Z.15포맷으로 정량화한다.
aecNearGain = floor(aecNearGain*32768)/32768;
end
%근단 음성의 경우 이 세가지 검출방법중 하나를 사용한다.
%각각의 방법은 특정 상황에 따라 근단 음성에 더 민감하다.
%모든 검출은 전체 음성이 절대적인 어떤 레벨 또는 노이즈 바닥값보다 충분히 클때만 발생하여, 잡음만 존재하는 상황을 거부한다.
%방법 1.
%(aecInEchoVoice<aecInVoice/4)는 (aecNearRatio >= 0.75)와 동등하다.
%그러나 전자는 정량화에 덜 민감하다.
%원단 단일 음성의 레벨이 낮은 경우에는 aecNearRatio에 스파이크가 종종 일어난다.
%그러므로, 이 경우의 잘못된 검출을 막기 위해 임계치가 높게 설정되어야 한다.
%이 검출 방법을 사용할 수 있는 단 하나의 조건은, statusgauge=0이고 음성 이득 바닥값이 0.4625=15155/32768보다 낮아야 한다는 것이다.
%후자의 임계치는 소거기가 충분히 훈련되지 않았을 경우에 잘못 검출이 일어나는 것과, 소거기 훈련이 시작되자 마자 가능한 한 빨리 쌍방 토크를 얼마나 빨리 검출하느냐에 대한 타협점에서 결정된다.
%
%방법 2.
%(aecInVoice>32/2^7 & anlpInVoice > anlpInNoise*8)은 저레벨 음성을 거부한다.
%이렇게 함으로서, 근단 음성의 전체 음성에 대한 비율에 더 민감하게 검출할 수 있다.
%즉, 받아들이는 조건을 status gauge=0으로 함으로, 원단 단일 토크를 거부하는 것을 돕는다.
%근단 음성에 대한 민감도는 aecNoiceGainBase를 따라 임계치를 변화시키면서 최적화한다.
%스케일링 계수 및 오프셋(offset)은 소거기가 충분히 훈련되지 않아 잘못된 검출을 하는 것을 얼마나 피하느냐와, 소거기 훈련이 시작된 후 얼마나 민감하게 근단 음성을 검출하느냐의 타협점에서 결정된다.
%
%방법 3.
%에코 억제가 갑자기 지속적으로 악화되는 경우, aecNearGain과 aecVoiceGainBase를 비교함으로써 근단 음성을 검출할 수 있다.
%왜냐하면, aecVoiceGainBAse는 갑자기 일어나는 변화에는 반응하지 않고, aecNearGain은 검출의 지속성을 확인하기 위해 필터를 사용하기 때문이다.
%aecNearGain을 계산하기 위해 필터를 사용하기 때문에, 조건이 좀더 완화된다. 이로 인해, 근단 음성에 더 민감해 질 수 있다. 이러한 조건에는 status gauge<0.3 (=0이 아니라)이고 그 음성에 대한 최소 절대 레벨이 증가하지 않는다는 조건이 포함된다.
%에코 경로가 변화한 다음, 원단 단일 토크가 시작될 때, aecNearGain는 떨어질 수 있지만, 어느 짧은 시간동안에는 aecVoiceGainBase보다 높은 곳에서 머물러 있다.
%이 경우 들릴 수 있는 에코를 피하기 위해, 근단 음성은 aecNearGain이 그 마지막 값보다 큰 경우에만 검출된다.
if((aecStatusGauge==0) & (aecInEchoVoice<aecInVoice/4)&...
(aecVoiceGainBase < 15155/32768)) | ...
(aecStatusGauge==0) & (aecInVoice>32/2^7) & ...
(anlpInVoice>anlpInNoise*8) & ...
(aecNearRatio - aecVoiceGainBase*1.5 >= 9830/32768)) | ...
((aecNearGain - aecVoiceGainBase >= 6554/32768) & ...
(aecNearGain > aecNearGainLast)),
%근단 음성이 검출됨
%만일 프레임에서 근단 음성의 새 주기가 시작되면(끊어지는 시간이 만료되고 마지막 프레임에 포함된 음성에 잡음만 있을 경우), 선형 에코 소거기의 에코 이득을 에코 이득 추정값의 바닥값으로 맞춘다.
%이는 근단 음성의 주기가 시작되는 경우만 수행하여, 바닥값을 갱신 없이 흘려보냄으로 인한 왜곡을 증가시키기 보다는, 잔류-에코 억제기의 감쇠를 일정하게 유지시킨다.
if(anlpNearSpeechCount==0) & (anlpNearSpeechFlag == 0),
aecEchoGain = aecVoiceGainBase;
end
%마지막 주기에 근단 음성이 포함되어 있었다는 것을 지시하는 플래그를 설정한다.
%음성이 검출되지 않는 프레임이 지속되는 동안 이것을 유지한다.
anlpNearSpeechFlag = 1;
%근단 음성의 끊어지는 시간(hang-time) 카운터를 리셋한다. 0이 아니면, anlpNearSpeechFlag를 덮어써서, 음성 에너지가 검출되기에는 너무 낮을 때 또는 쌍방 토크동안에, 근단 음성의 잔류 에코 억제기에 의한 왜곡을 최소화한다.
%이 카운터가 원단 단일 토크가 검출될 때만 시작된다면, 쌍방 토크 동안의 근단 음성이 끊기는 것을 줄일 수 있다.
%그러나, 원단의 사람은, 그/그녀가 근단 사용자의 말이 끝난 후 말을 시작할 때마다 긴 시간의 정적 후에 에코를 듣게 될 것이다.
%근단 음성에서 원단 단일 토크로 빨리 전환이 일어날 때(가령, 근단의 사람이 원단 사람이 말하는 중간에 말할 때) 끊기는 시간(hang-up time)에 의해 원단 사용자가 에코(-25dB)를 듣는 짧은 주기가 유발된다. 이러한 인공적인 에코는 어느정도 가치가 있는데, 왜냐하면, 끊기는 시간에 의해 쌍방 토크 동안에 끊김을 크게 줄이기 때문이다.
anlpNearSpeechCount = 25; %25*20ms = 500ms hangtime
end
end
%에코 추정 음성 에너지가 적어도 근단 음성 에너지의 15/16이면, 이 프레임에는 원단 에코 음성만 포함되어 있다고 가정하고, 이 근단 음성 플래그(flag)를 리셋한다. 만일 근단음성 끊김시간 카운터가 이미 만료되었다면, 잔류 에코 소거기는 즉시 원단 단일 토크 모드로 전환한다. 그렇지 않으면, 잔류 에코 억제기는 근단음성 끊김시간 카운터가 만료될 때 원단 단일 토크 모드로 전환된다.
%근단 음성이 카운터가 진행중인 동안에 다시 검출될 수 있고, 그러면 잔류 에코 소거기가 카운터가 한 번 만료되면 근단 음성 모드에 그대로 있다는 것을 인지하라.
%이 검출 스킴은 32비트 숫자 비교를 수행하고, 에너지 레벨, 상태 게이지, 또는 전단계 프레임으로 부터의 측정값(잡음 추정값 제외)에 기초한 만족조건(qualifier)을 사용하지 않는다. 그러므로 이 스킴은 안정적이라기 보다는 민감하다. 이 스킴이 원단 음성 검출에 실패한다면, 원단의 사용자는 그/그녀가 근단 사용자의 말 후에 말하기 시작했을 때 좀 긴 정적 후에 에코를 듣게 될 것이다.
if(aecInEchoVoice>(aecInVoice-aecInVoice/16)),
anlpNearSpeechFlag = 0;
end
%만일 근단음성 끊김시간 카운터가 만료되었으면, 음성을 포함한 마지막 프레임은 에코일 뿐이다. 그러면 선형 에코 소거기 에코 이득값을 마지막으로 측정된 선형 에코 소거기 음성 이득값으로 맞춘다.
%이것은 근단 음성이 없다고 가정하여, 잔류 에코 억제기가 모든 음성을 억제하려 할 것임을 가정한다. 이 테스트는 anlpNearSpeechFlag를 초기화(clear)하여 aecEchoGain이 결정을 즉시 반영하는 것 이후이다.
if(anlpNearSpeechCount==0) & (anlpNearSpeechFlag == 0),
aecEchoGain = aecVoiceGain;
end
aecVoiceGainHist(frame) = aecVoiceGain; %디버그를 위해 저장해 둔다
aecVoiceGainBAse %상태에 대한 에코
aecVoiceGainBaseHist(frame) = aecVoiceGainBase; %디버그를 위해 저장해 둔다
aecEchoGain %상태에 대한 에코
aecEchoGainHist(frame) = aecEchoGain; %디버그를 위해 저장해 둔다
aecNearRatioHist(frame) = aecNearRatio; %디버그를 위해 저장해 둔다
aecNearGainHist(frame) = aecNearGain; %디버그를 위해 저장해 둔다
anlpNearSpeechCount %상태에 대한 에코
anlpNearSpeechFlag %상태에 대한 에코
%ANLP까지 루프 에코 이득을 계산한다. ANLP는 필요할 때 감쇠를 하여, 시스템에 대한 전체 루프 에코 억제의 목표를 달성한다.
%?는 음량조절을 통한다.
%aecChanGain은 확성기에서 나와 마이크로폰으로 들어간다 -- 이것이 채널이다.
%aecEchoGain은 선형 에코 소거기의 입력에서 출력으로 들어간다.
aecLoopEchoGain = aecChanGain * aecEchoGain; %음량 조절을 여기에 삽입한다.
%Z.15포맷으로 정량화한다.
aecLoopEchoGain = floor(aecLoopEchoGain*32768)/32768
%ANLP윈도우 사이즈를 설정하여 잔류 에코의 기대치를 포착한다. 그 이상으로 크게 하지는 않는다.
%이것은 근단 음성 및 잡음의 왜곡을 최소화한다. ANLP윈도우 사이즈는 AEC가 에코 이득을 증진시킬수록 작아진다. 그러므로, aecCHanGain및 aecEchoGain을 사용하여 윈도우 사이즈를 조절한다. 음량조절 이득은 사용되지 않는데 왜냐하면 ANLP의 포락면-검출장치 입력값이 음량 조절 후에 나오기 때문이다. 에코 이득 측정값은 RMS로 측정되지만, ANLP는 최고치를 포함한 전체 잔류 에코를 억제할 필요가 있다. 그러므로, 최고치 대 RMS 계수를 곱하는 값(multiplier)(=3)으로 사용한다. anlpWindowGain의 동적인 범위는 2인데 왜냐하면, 선형 에코 소거기가 전반적으로 훈련이 되었을 때, anlpWindowGain은 적어도 2가 되어야 윈도우 내에서 에코를 잡을 수 있다.
anlpWindowGain = min(2*ONE, 3*aecChanGain*aecEchoGain);
%Z.14포맷으로 정량화한다.
anlpWindowGain = floor(anlpWindowGain*16384)/16384;
%만일 VAD가 확성기에 잡음만 들린다고 지시하면, ANLP를 전달(pass-through)모드로 놓는다(gain=ONE). VAD는 고음질의 근단 단일 토크를 가능하게 하는데, 왜냐하면, VAD에는 근단 음성 및 잡음의 왜곡이 없기 때문이다. VAD는 잡음만 있을 때 종종 음성이 있다고 판단하곤 하기 때문에, 이 경우 근단 음성 또는 잡음의 왜곡을 최소화 하기 위한 다른 방법이 필요하다. 또한, VAD는 자주는 아니지만 저레벨 음성이 있는 경우 잡음만 있다고 판단하는 경우가 있다. 이 문제는 확성기 상의 잡음 레벨에 비례한다. 그러나, 루프에서 선형 에코 소거기를 가짐으로 이 경우에 에코가 들리지 않도록 에코를 충분히 억제하는 것이 가능하다.
if(speakerVad(frame)==0, %근단 단일 토크의 경우
anlpEchoGain = ONE;
%speakerVad = 1이므로, 확성기는 음성성분을 가질 가능성이 가장 크다. 하지만 꼭 그렇지는 않다. 근단 음성이 검출되면, 쌍방 토크라고 가정한다. 이 경우, 전체 루프에서의 에코 억제의 목표는 -25dB(1843/32768)로 설정하고, ANLP이득값은 루프의 나머지 부분에서 제공되지 않는 에코 억제에서 필요한 정도로 정한다.
%ANLP이득은 높고(억제는 낮고), 왜곡은 사용자가 음량을 최고레벨에서 낮춤에 따라 줄어든다. 선형 에코 소거기가 훈련되면, aNLP이득은 보통 이 모드에서 -10dB보다 높다. 그러므로 잡음 마스킹(masking)은 음질을 개선시킬 수 없다. 원단 사용자는 쌍방 토크동안에 얼마간의 에코를 듣는다. 하지만 이러한 인공적인 효과는 근단 음성의 높은 왜곡을 막기 위해 양호하다고 할 수 있다.
elseif(anlpNearSpeechCount>0) | (anlpNearSpeechFlag==1), %쌍방 토크
anlpEchoGain = 1843/32768 / aecLoopEchoGain;
%speakerVad=1이고 근단음성이 검출되지 않기 때문에, 원단 단일 토크라고 가정한다. 전체 루프의 에코 억제의 목표는 -56dB(52/32768)로 양쪽 단의 배경이 조용할 경우 에코가 거의 들리지 않는다.
%쌍방 토크 모드에서, ANLP이득은 루프의 나머지 부분에서 제공되지 않는 필요한 에코 억제 레벨로 설정되고, ANLP이득은 높고 왜곡은 사용자가 최고 레벨에서부터 볼륨을 낮추고 선형 에코 소거기가 훈련됨에 따라 줄어든다. 그러나, 에코를 감쇠하여 잡음 바닥값(floor) 아래로 낮추는 만큼의 감쇠에 필요한 이득은, 높을 수 있다. 그러므로, 이 두 이득값 중 높은 값을 ANLP가 왜곡을 최소화 하는데 사용한다. 듣기편한 잡음이 없으면, 같은 계수로 에코와 잡음을 모두 감쇠하는 것은 신호-대-잡음 비율을 변화시키지 않는다. 그러므로 잡음 마스킹은 효과가 없다. 듣기편한 잡음은, ANLP의 입출력에서의 잡음이 같은 레벨이도록 설정된다. 그러므로, ANLP는 필요 이상으로 왜곡을 가하지 않으면서 에코를 잡음 바닥 값 아래의 임계치로 감쇠한다. 제곱근값은 잡음 대 음성의 비율로 설정되는데 왜냐하면, 이러한 변수들은 에너지의 단위이기 때문이다. 에코 대 잡음 비율에 실제 잡음 대 에코 비율을 곱하는 것은 잡음 성분을 빼버리는 것이다(factor out). 남은것은, 에코를 마스킹하기 위해 필요한 이득으로서의 원하는 정도 대 실제 에코 비율이다.
else %원단 단일 토크 상태
ECHO_TO_NOISE_GOAL = 1/8; %-18dB
if(anlpInVoice>anlpInNoise),
anlpEchoGain = max(52/32768/aecLoopEchoGain, ...
ECHO_TO_NOISE_GOAL *
sqrt(anlpInNoise/anlpInVoice));
else
%잡음이 많은 상태에서는, 이득은, 이론적으로 낮은 에너지 음성에 대한 것이라 하더라도, ECHO_TO_NOISE_GOAL을 넘어서지 못한다. 왜냐하면,
%잡음의 레벨이 빨리 떨어질 때(자동차가 속력을 줄일 때), 잡음의 추정치는 너무 크기 때문이다. 이로 인해, ANLP 에코 이득이 너무 클때 에코가 들리게 된다. anlpEchoGain = max(52/32768/aecLoopEchoGain, ECHO_TO_NOISE_GOAL); end end
anlpEchoGain = min(ONE, anlpEchoGain);
%Z.15포맷으로 정량화한다.
anlpEchoGain = floor(anlpEchoGain*32768)/32768;
anlpGainHist(frame) = anlpEchoGain; %디버그를 위해 저장해 둔다
%필요하다면 근단음성 끊김 카운터를 감소시켜, 확성기 VAD에 무관하게 동작하도록 한다.
anlpNearSpeechCount = max(0, anlpNearSpeechCount-1);
%
%ANLP표본 섹션
%
%ANLP 에코 이득이 ONE이라면, ANLP는 비활성화되있는 것이다. -- MIPS를 줄이기 위해 생략한다.
if(anlpEchoGain==ONE),
%포락면 검출 동작은 유지한다.
for k=1:FRAME_SIZE,
anlpRef = aecRef(FRAME_SIZE-k+1);
anlpRefEnvelope = max(abs(anlpRef), 255/256*anlpRefEnvelope);
anlpRefEnvelope = floor(anlpRefEnvelope*2^31)/2^31;
end
%AC-중앙 감쇠기에서 사용되는 변수들을 전체 프레임을 처리하고 나서 생기는 결과와 같게 갱신한다.
anlpOutLast = uplinkAudio(FRAME_SIZE);
else
for k=1:FRAME_SIZE,
%ANLP원단 ref=AEC 참조값. 첨가적으로 또는 대신에 aecEchoEst를 사용하는 것은 더 좋은 결과를 주지 못하는데, 왜냐하면 aecEchoEst는 잔류 에코에 무관하기 때문이다. AEC ref는 같은 효과를 주는데, 왜냐하면, 이것은 anlpIn에서 제일 이른 에코보다도 앞에 나오기 때문이다. 최고치 검출장치의 장기(long time)상수가 이 ANLP의 키(key)로서 필요하지 않는 잔류 에코와 일치(matching)하는 가까운 지연을 만들기 때문이다. AECRef 지연선으로의 오프셋은 업샘플링, 다운샘플링, 버퍼 및 /또는 최소 채널 지연에 의해 에코 경로에 고정 지연을 보상하도록 변경될 수 있다.
%anlpRef = aecRef(FRAME_SIZE-k+1);
%anlpRef신호의 포락면을 검출한다(최고치를 검출한다).
%최고지 검출장치의 지수적 감소요소는 자동차의 여진의 감소를 모델링한다.
%시간상수는 천천히 감소하는 예상되는 여진을 다룰 수 있도록 설정된다.
%폴(pole)이 255/256보다 작으면 에코가 통과된다(get through)
%폴이 255/256보다 크면 근단에 지나친 왜곡을 가한다.
anlpRefEnvelope = max(abs(anlpRef), 255/256*anlpRefEnvelope);
%저장할 수 있게 하기 위해 anlpRefEnvelope는 32비트여야 한다.
%anlpRefEnvelope를 16비트로 반올림하면 512/2^15보다 낮게 감소한다.
%anlpRefEnvelope를 16비트로 잘라버리면 256/2^15보다 낮아질 때 표본당 1비트씩 감소하고, 이것은 너무 빨리 일어난다(에코가 통과될 정도로).
%Z.31포맷으로 정량화한다.
anlpRefEnvelope = floor(anlpRefEnvelope*2^31)/2^31;
%ANLP의 델타값(Delta value)은 ONE으로 제한되어 AEC에 의해 제어되는 이득값이다.
anlpDelta = min(ONE, ...
anlpWindowGain*floor(anlpRefEnvelope*32768)/32768);
%Z.15포맷으로 정량화한다.
anlpDelta = floor(anlpDelta*32768)/32768;
anlpDeltaHist((frame-1)*FRAME_SIZE+k)=anlpDelta; %디버그를 위해 저장한다.
%
%AC-중앙 감쇠기 실행
%
%ANLP입력은 잡음억제장치를 통하여 AEC출력으로 연결된다
anlpIn = uplinkAudio(k);
%입력이 윈도우 아래에 있으면
if(anlpOutLast - anlpIn)>=anlpDelta,
%윈도우 밖의 모든 신호는 사용하고, 윈도우 안의 신호는 감쇠한다
anlpOutLast = anlpIn + anlpDelta - ...
anlpEchoGain*anlpDelta;
%그렇지 않으면 입력은 윈도우 위에 있다.else if(anlpIn - anlpOutLast) >= anlpDelta윈도우 밖의 모든 신호를 사용하고 윈도우 내의 신호는 감쇠한다.anlpOutLast = anlpIn - anlpDelta + ... anlpEchoGain * anlpDelta;그렇지 않으면, 입력은 윈도우 내에 있다.else,
삭제
%신호를 감쇠한다
anlpOutLast = anlpEchoGain*(anlpIn-anlpOutLast)+anlpOutLast;
end
%S.15포맷으로 정량화한다
anlpOutLast = floor(anlpOutLast*32768)/32768; %다음을 위해 저장해둔다
%
%ANLP 출력 잡음이 자동차 잡음과 같은 레벨을 가지고 비슷한 스펙트럼을 가지도록 ANLP입력으로 듣기편한 잡음을 첨가한다.
%
%자동차에서 포착된 잡음의 프레임으로부터의 임의의 표본을 사용한다.
%자동차에서 포착한 오디오에 우연히 음성이 들어가 있다고 하더라도, 자동차의 잡음과 같은 세기의 백색 잡음을 생성한다.
anlpSeed = rem(48271*anlpSeed, 2147483647);
anlpComfortNoiseIn = anlpComfortNoise(1+...
rem(anlpSeed, COMFORT_NOISE_SIZE));
%위에서 언급된 ARMA모델을 사용하여 백색 잡음을 필터링한다.
%anlpArGain = 1-anlpArCoef라고 가정하면 다음은 동등하다.
%anlpComfortNoiseOut = anlpArCoef*anlpComfortNoiseOutOld + ...
% anlpArGain*(anlpComfortNoiseIn + 0.8125*anlpComfortNoiseInOld);
ma = anlpComfortNoiseIn + 0.8125*anlpComfortNoiseInOld; %평균이 변한다.
maDiff = anlpComfortNoiseOutOld - ma;
%S1.15포맷으로 정량화한다.
%듣기편한 잡음으로 편중되는 것을 막기 위해 반올림을 해야 한다.
%0.5의 소수로 음수를 반올림할 때, 1의 보수 소수점이 2의 보수와 같이 동작하도록 하기 위해 2^(-17)을 더한다.
maDiff = round(maDiff*32768+2^(-17)/32768;
anlpComfortNoiseOut = ma+anlpArCoef*maDiff;
%S.15포맷으로 정량화한다.
%듣기편한 잡음으로 편중되는 것을 막기 위해 반올림을 해야 한다.
anlpComfortNoiseOut = round(anlpComfortNoiseOut*32768+2^(-17))/32768;
anlpComfortNoiseOut = max(-1, min(ONE, anlpComfortNoiseOut));
%다음 루프를 위한 변수 지연
anlpComfortNoiseInOld = anlpComfortNoiseIn;
anlpComfortNoiseOutOld = anlpComfortNoiseOut;
%듣기편한 잡음을 윈도우 사이즈로 제한한다.
anlpComfortNoiseOut = min(anlpDelta, ... max(-anlpDelta, anlpComfortNoiseOut ));
%듣기편한 잡음을 스케일링하여 ANLP출력 잡음이 ANLP입력 잡음의 레벨과 같아지도록 한다.
anlpComfortNoiseOut = anlpComfortNoiseOut * (ONE-anlpEchoGain);
%S.15포맷으로 정량화한다.
anlpComfortNoiseOut = floor(anlpComfortNoiseOut*32768)/32768;
%듣기편한 잡음을 ANLP출력 신호에 첨가한다
uplinkAudio(k) = max(-1, min(ONE, anlpOutLast+anlpComfortNoiseOut);
end
end
%프레임에 걸쳐 얻은 파일 출력을 정수 포맷으로 저장한다
fwrite(fidOut, [uplinkAudio; aecOut]*32768, 'int16');
%disp(['aecInEnergy = 'dec2hex(aecInEnergy*ENERGY_SCALE)])
%disp(['aecErrorShift = 'dec2hex(aecErrorShift+(aecErrorShift<0)*65536)])
%disp(['aecUpdate(1) = 'dec2hex(aecUpdate(1)*32768+(aecUpdate(1)<0)*65536)])
%신호의 프레임 에너지에 기초하여 잡음 프레임 에너지를 추정한다.
삭제
%기분 기반(norm-based) 잡음 추정치는 32비트 변수를 더 넓은 동적인 범위에 제공한다. 그리고, 잡음 레벨이 낮은 경우에도 작동을 일관성있게 할 수 있다.(test_65.raw와 같은 원단의 경우에).
%그러나, 기준 기반 알고리즘은 제곱근 및 32비트 제곱을 구하는 것을 필요로 한다(MIPS가 더 든다).
%이 에너지-기반 알고리즘은 저레벨 잡음의 정량화에 최적화되어 있다.
%그리고, 잡음 레벨 추정치가 매우 낮은 잡음 레벨(음성이 항상 잡음보다 훨씬 크다)에 대해 중요하지 않는다는 것을 특별히 고려하여 수용가능한 작업을 행한다.
%또한, 기준 기반 알고리즘이나 에너지-기반 알고리즘에서 적응의 속도는 같다.
%펌핑(pumping) 동작에는 쉬프트(shift)를 사용했다. 기준 기반 알고리즘에서는 한 비트 쉬프트만 사용했다.
%
%목표는, 신호에 음성성분이 없으면 추정을 신속하게 갱신하고, 그렇지 않으면 천천히 하는 것이다.
%자동차 잡음이 빨리 변화하는 것을 추적하기 위해 일정한 적응(constant adaptation)이 필요하다.
%음성 검출기(VAD)출력은 신속하게 갱신하는 때를 결정하기 위한 좋은 시작점이다. 그러나, 잡음보다 훨씬 큰 저레벨의 음성이 실제로 있을 때, 음성이 없다고 나타내는 경우가 종종 있다.
%noVoiceFlag는 선형 에코 소거기의 상태 게이지에 의해 만족된 VAD출력으로 신뢰도를 증가시킨다.
%그러나, 상태 게이지는 근단 음성와 쌍방 토크, 또는 그 톤(tone)사이의 차이를 만들어 내지 못한다. 그러므로, 빠른 갱신 주기동안에는 음성성분을 견딜 수 있는 알고리즘이 필요하다.
%원단 단일 토크 동안에 상태 게이지가 잘 작동할 때, 즉, 잡음 추정치가 정확하여 에코가 들리는 것을 방지해야 할 때
%(근단 음성에서 주로 생기는) 잘못된 편차를 줄이기 위해 여기서 사용된 트릭(trick)은 선형적으로 에너지 신호를 필터링하기보다, 비교 결과에 기초하여 추정치를 고정 속도로 펌핑업 및 다운하는 것을 줄인다.
%펌핑다운 시상수의 1/4인 펌핑업 시상수를 사용하는 것은 추정치가 어떤 음성에도 불구하고 잡음 바닥값을 향하도록 한다.
%고정 시상수 대신 고정된 증분(increment)만큼 펌핑업 및 펌핑다운은 시상수가 잡음 레벨만큼 변하도록 한다.
%
%상승 잡음의 바닥치와 음성성분 사이의 차이를 구분하는 것은 어렵다.
%여기서 펌핑업(pump-up) 시상수는 추적 레이트(tracking rte)를 결정한다.
%그러나, 펌핑업 시상수는 음성 동안에 잘못된 증가를 최소화할 만큼 느려야 한다.
%상태 기계(state machines)는 특정 조건 하에서 잡음 추정치를 빨리 증가시키도록 구현되어야 한다.
%상태 기계에서, 음성이 없는 동안, 신호 에너지가 잡음 추정치보다 8배 이상 커서 적어도 900ms임을 관측하면, 잡음의 바닥값이 증가했다고 보고, 잡음의 바닥값을 테스트 기간에서의 테스트 잡음 추정치와 같게 맞춘다.
%잡음 입력이 원단에서의 잡음에 지배될 때, AMPS의 대역 내 제어 채널 또는 빈약한 RF조건에 의한 블랭킹(blanking)은 잡음 추정치를 일시적으로 떨어뜨린다. 상태 기계는 블랭킹 후에 잡음 추정치를 회복시키려고 시도한다.
%첫째로는 에너지의 강하(drop)가 5에서 25프레임 길이 사이임을 확인한다
%그리고 나서 에너지가 원래 레벨로 복귀되는 것을 확인한다.
%에너지가 본래 잡음 레벨 주위의 윈도우 안에 머물러 있으면, 비교적 짧은 확인 주기만이 필요하다.
%에너지가 본래 레벨보다 훨씬 더 높아지면, 음성이 생긴 것일 수 있으므로, 잡음 바닥값이 떨어지지 않도록 하기 위해 보다 긴 확인 주기가 필요하다.
%
%noiseStateVars 배열에 대한 정의
% (1) = 잡음 추정치
% (2) = 블랭킹 또는 테스트 잡음 추정 전의 잡음 추정치
% (3) = 상태 변수/카운터
%
function [confirmedNoVoiceFlag, noiseStateVars] = ...
estnoise(inEnergy, noVoiceFlag, noiseStateVars)
%모 루틴(parent routine)에서와 마찬가지 방법으로 필요한 상수를 정의한다
%갱신 결합(integration)주기에서의 표본의 개수
FRAME_SIZE = 160;
%표본 프레임에 걸쳐 누적된 오른쪽 쉬프트 값에 대한 비트의 개수
FRAME_BITS = ceil(log2(FRAME_SIZE));
%계수를 스케일하여 에너지를 32비트로 정량화한다 (Z8.23포맷 w/FRAME_SIZE=160)
ENERGY_SCALE = 2^(31-FRAME_BITS);
%모 루틴이 잡음 추정치를 초기화 하였으면
if noiseStateVars(1) == FRAME_SIZE,
%
%호출 시작의 적응속도를 빠르게 하기 위한 동작을 한다
%플래그를 설정하여 듣기편한 잡음이 이 레벨에서 초기화되도록한다.
confirmedNoVoiceFlag = 1;
%잡음 추정치를 에너지와 같게 한다
noiseStateVars(1) = inEnergy;
else
%
%잡음 추정치를 갱신한다
%디폴트(default)로, 플래그를 클리어(clear)하여 듣기편한 잡음 훈련이 없음을 나타낸다
confirmedNoVoiceFlag = 0;
%다음 바이어스 테스트(bias test)는 백색 잡음을 가지고 MATAB에서 수행되었다.
%>>n=160*3000;noise=zeros(1,m);
%>>seed=1;for i=1:n,[noise(i) seed]noisegen(seed);end
%>>m=3000;for i=1:m,noiseEnergy(i)=sum(noise(160*(i-1)+1:160*i).^2);end
%>>ne=100;for i=1:m,if ne>noiseEnergy(i),
%>>ne=ne-ne/16;else,ne=ne+ne/64;end,neh(i)=ne;end
%>>plot(neh); %neh는 잡음 추정 이력이다.
%>>axis([0 20 0 100]) %neh 가 10프레임 이후에 정해진다
%>>1/(sum(neh(11:m))/(m-10)/(sum(noiseEnergy)/m)-1)
%ans=-14.2082
%이는 잡음 추정치에 -1/14정도의 바이어스 계수가 있다는 것을 나타낸다.
%계산을 간단히 하기 위해, 비교 목적의 잡음 추정치에서 1/16계수를 빼서 바이어스를 복원한다.
%이는 바이어스를 복원하는 목적에서 비교를 위한 것이다
%어셈블리어로, 비트 단위의 뺄셈 전에 오른쪽 쉬프트를 한다
noiseBiased = noiseStateVars(1) - noiseStateVars(1)/16;
%32비트로 정량화한다.
noiseBiased = ceil(noiseBiased*ENERGY_SCALE)/ENERGY_SCALE;
%
%VAD와 상태 게이지가 음성이 없다고 나타내면
if noVoiceFlag, %
%잡음 추정치를 신속하게 펌핑한다
%
if noiseBiased>inEnergy,
%
%잡음 추정치를 신속하게 펌핑다운한다.
%감소하는 잡음 바닥값에 대한 추적 속도를 빠르게 하기 위해, 잡음 추정치가 8의 계수보다 너무 높으면, 즉시 잡음 추정치를 신호 에너지와 같게 맞춘다
%그러나, 이는 활성화되면 음수방향으로 편중되게 되어, 잘못 검출하는 오류를 범하게 된다
%이 시상수는 너무 짧아서 잘 동작하지 못하고 잡음 추정치를 펌핑다운하게 된다.
%
%유도를 최소화하기 위해, 잡음 추정치가 신호 에너지와 같은 경우는 값을 펌핑다운하지 않는다.
%정량화를 하면 0을 제외하고는 값에 1/ENERGY_SCALE의 최소 변화를 일으킨다.
%어셈블리어로, 비트 단위로 오른쪽 쉬프트를 하기 전에 음수를 취소한다.
noiseStateVars(1) = noiseStateVars(1)-noiseStateVars(1/16);
%듣기편한 잡음을 위한 플래그를 설정한다.
%입력 에너지가 잡음 추정치보다 낮아야 한다는 요구조건은 음성이 있는 동안에 잡음 추정치가 갱신될 확률을 높인다
confirmedNoVoiceFlag = 1;
else
%
%잡음 추정치를 펌핑업한다.
%
%0 부근에서 시작하는 것읖 피하기 위해 증분을 최소화한다
%min(noiseStateVars(1)/64, 1/ENERGY_SCALE)을 더하는 것이 대신 사용되지 않는다
%왜냐하면, 이것을 더하면 갑자기 증가하는 잡음에 대한 적응을 느리게 한다
noiseStateVars(1) = noiseStateVars(1)+noiseStateVars(1)/64+...1/ENERGY_SCALE;
end
else
%
%잡음 추정치를 천천히 펌핑한다.
%음성이 있는동안에는 적응을 멈추지 않는다
%왜냐하면 잡음의 바닥값이 줄어드는 것을 정확히 추적하는 것은 중요하기 때문이다. %잡음의 과도 추정은 음성 에너지의 부족 추정을 유발한다.
%이것은 낮은 원단 음성 에너지에 의해, 선형 잡음 소거기보다는 NLP 입력에 더 많은 충격을 준다.
%그러므로, 에코 억제가 불충분해진다
%그러므로, 과도 추정 잡음보다 부족 추정이 더 낫다. %
%잡음 추정치가 너무 높으면
if noiseBiased>inEnergy
%
%잡음 추정치를 펌핑다운한다.
%정량화는 0을 제외하고는 1/ENERGY_SCALE의 최소 변화를 일으킨다.
%어셈블리어로, 비트 단위로 오른쪽 쉬프트를 하기 전에 취소한다.
noiseStateVars(1) = noiseStateVars(1)-noiseStateVars(1)/64;
else
%
%잡음 추정치를 펌핑업한다.
%
%그냥 보면, 음성이 있을 때는 감소하는 잡음 바닥값을 정확하게 추적하기 위해서는 추정치를 내리는 것만 필요한 것처럼 보인다.
%그러나, 이렇게만 하면 지나치게 음수 방향으로 편향된다
%펌핑업 레이트는 되도록 빠르게 되도록 실험적으로 결정한다. 이 때, 음성이 있는 동안에는 잘못된 변화가 너무 많이 일어나는 것은 허가하지 않는다.
%이것은 매우 느린 것인데 왜냐하면 멈춤 사이에서 음성은 몇초간 그냥 남아 있을 수 있기 때문이다.
%최소 증분을 사용하지 말라, 사용하면 음성이 있는 동안에 낮은 잡음에 대한 램프업(ramp up)이 너무 커진다.
noiseStateVars(1) = noiseStateVars(1)+noiseStateVars(1)/1024;
end
end
%32비트로 정량화한다
noiseStateVars(1) = floor(noiseStateVars(1)*ENERGY_SCALE)/ENERGY_SCALE
%
%AMPS 블랭킹과 잡음 오름 추적을 위한 상태 기계
%초기에는 실행시키지 않는다.
%%상태 기계가 유휴 상태(idle state)에 있으면,
%if noiseStateVars(3)==0,
%만일 신호 에너지가 잡음 추정치 아래로 많이 떨어지면
%그리고 만일 inEnergy의 정량화가 잘못된 결과를 내지 않는다면
if noiseStateVars(1)>max(8*inEnergy, 8/ENERGY_SCALE),
%상태기계를 위해서 잡음 추정치를 저장해 둔다
noiseStateVars(2) = noiseStateVars(1);
%블랭킹을 찾기 위해 상태 기계를 시작한다
noiseStateVars(3) = 1;
%VAD와 상태 게이지가 음성이 없다고 지시하고, 신호 에너지가 잡음 추정치보다 많이 높으면, 그리고 잡음 추정치의 정량화가 잘못된 결과가 나오지 않으면
elseif noVoiceFlag& ...
(inEnergy>max(8*noiseStateVars(1), 8/ENERGY_SCALE)),
%테스트 잡음 추정치를 초기화한다.
noiseStateVars(2) = inEnergy;
%잡음 오름을 찾기 위해 상태 기계를 시작한다.
noiseStateVars(3) = -1;
end
%상태기계가 잡음오름을 찾고 있으면
elseif noiseStateVars(3)<0,
%VAD와 상태 게이지가 계속해서 음성이 없다고 나타내면, 그리고 신호 에너지가 잡음 추적장치보다 계속 높으면
if noVoiceFlag & (inEnergy>8*noiseStatusVars(1)),
%일반적인 것과 마찬가지로 테스트 잡음 추정치를 편중시킨다.
%어셈블리어로, 비트 단위로 오른쪽 쉬프트를 하기 전에 취소한다.
noiseStateVars(2) = noiseStateVars(2)-noiseStateVars(2)/16
%32비트로 정량화한다
noiseBiased = ceil(noiseBiased*ENERGY_SCALE)/ENERGY_SCALE;
%테스트 잡음 추정치가 너무 높으면
if noiseBiased>inEnergy
%테스트 잡음 추정치를 펌핑다운한다.
%정량화는 1/ENERGY_SCALE의 최소 변화를 일으킨다.
%어셈블리어로, 비트 단위로 오른쪽 쉬프트를 하기 전에 취소한다.
noiseStateVars(2) = noiseStateVars(2) - noiseStateVars(2)/16;
else
%테스트 잡음 추정치를 펌핑업한다.
noiseStateVars(2) = noiseStateVars(2) + noiseStateVars(2)/64;
end
%32비트로 정량화한다
noiseStateVars(2) = floor(noiseStateVars(2)*ENERGY_SCALE)/ENERGY_SCALE;카운터로서 동작하는 상태 변수를 감소시킨다.noiseStateVars(3) = noiseStateVars(3) - 1;
%충분한 기간동안 신호 에너지가 잡음 추적치보다 계속 높으면
%(s_top10_1.raw 테스트 추적의 에코를 위해서는 45프레임이 필요하다
if noiseStateVars(3)==-45,
%잡음 추정치를 테스트 잡음 추정치로 올린다
noiseStateVars(1) = noiseStateVars(2);%상태 기계를 유휴 상태로 리셋한다.noiseStateVars(3) 0;end
else
%상태 기계를 유휴 상태로 다시 돌린다.
noiseStateVars(3) = 0;
end
%만일 상태기계가 블랭킹을 찾고 있으면
else,
%상태 변수를 증가시킨다
noiseStateVarse(3) = noiseStateVars(3)+1;
%1-100 상태를, 인증된(alleged) 블랭킹기간동안에 프레임 수를 카운트한다.
if noiseStateVars(3)<101,
%에너지가 다시 높아지면, if 8*inEnergy > noiseStateVars(2), 블랭킹이 5프레임보다 작으면
if noiseStateVarse(3)-1<5,
%검출이 잘못된 것이거나 잡음 추정치를 복원할 만큼 가치가 있는 것이 아니다.
%상태 기계를 다시 유휴 상태로 돌린다
noiseStateVars(3) = 0;
else
%블랭킹 후에 음성이 생겼거나 잡음이 복귀되었다.
%상태 변수를 101로 맞추고 다음 단계를 시작한다.
noiseStateVars(3) = 101;
end
%저 에너지 프레임의 카운트가 너무 길면
elseif noiseStateVars(3)-1==25,
%블랭킹이 일어나지 않은 경우임 -- 잡음 바닥값이 그 대신 떨어짐
%상태 기계를 다시 유휴 상태로 놓는다.
noiseStateVars(3) = 0;
end
%상태 기계가 인증된 블랭킹 주기의 마지막이라고 검출한다.
%상태 기계가 음성 또는 잡음의 프레임을 카운트하는 것에 관계없이 우선 에너지가 다시 낮아졌는지 점검한다
elsief 8*inEnergy<noiseStateVars(2),
%블랭킹이 일어나지 않은 경우임 -- 잡음 바닥값이 그 대신 떨어짐 상태 기계를 다시 유휴 상태로 놓는다.
noiseStateVars(3) = 0;
%101-200 상태를, 인증된(alleged) 블랭킹기간을 따르는 음성 또는 잡음 프레임 수를 카운트한다.
elsief noiseStateVars(3)<201,
%에너지가 너무 높이 올라가면
if inEnergy>noiseStateVars(2)*8,
%이것이 음성이라고 가정한다
%상태 변수를 201로 하고 다음 단계를 시작한다
noiseStateVars(3) = 201;
%최대 및 최소 에너지가 저장된 잡음 추정치와 가까운 경우에 프레임 수가 충분하면
elseif noiseStateVars(3)-101==10,
%블랭킹이 확인됨.
%잡음 추정치를 블랭킹 전의 값으로 되돌림
noiseStateVars(1) = noiseStateVars(2);
%상태 계계를 다시 유휴 상태로 놓는다
noiseStateVars(3) = 0;
end
%201-300 상태를, 인증된(alleged) 블랭킹기간을 따르는 음성의 프레임 수를 카운트한다.
%
%최소 에너지가 저장된 잡음 추정치와 가까울 때 프레임 카운트가 충분하면
elseif noisestateVars(3)-201==50,
%블랭킹이 확인됨
%잡음 추정치를 블랭킹 전의 값으로 되돌림
noiseStateVars(1) = noiseStateVars(2);
%상태 기계를 다시 유휴 상태로 놓는다
noiseStateVars(3) = 0;
end
end
end
당업자라면 본 발명을 설명할 목적으로 본원에서 설명된 특정예들에 한정되지 않음을 이해할 것이다. 예를 들어, 기술된 실시예의 여러 기능 블럭들은 사실 개념적인 것이다. 이러한 블럭들의 기능을 실제 실현하는 것은 여러 기술을 사용함으로써 달성될 수 있다. 또한, 각 예시적인 시스템은 예를 들면 다수의 표준 디지탈 신호 처리 칩, 하나의 애플리케이션 표준 집적 회로 또는 적합한 구성의 컴퓨터를 사용함으로써 실현될 수 있다.
또한, 음향 에코 소거 문단에서 예시적인 실시예들이 설명되었다 하더라도, 본 발명은 망 에코 소거 환경에서도 동일하게 응용가능하다 (예를 들면, 근단 사용자가 지상 사용자이고 원단 사용자가 이동하는 사용자인 경우). 또한, 본 발명의 특정한 양태는 전형적으로는 통신 시스템에 응용가능한 것으로 에코 억제 시스템에 제한되는 것은 아니다. 그리하여, 본 발명의 범주는 전술한 설명이라기 보다는 본원에 첨부된 청구범위에 의해서 한정되며, 청구범위의 사상과 일치하는 모든 등가적인 사항들을 포함할 수 있다.
Claims (20)
- 제1 통신 신호를 감쇠시켜, 제2 통신 신호의 반사에 의해 생기는 상기 제1 통신 신호의 에코 성분을 억제하도록 구성된 에코 억제기; 및상기 에코 억제기에 접속되고 상기 제2 통신 신호에 음성 성분이 포함되어 있는지를 지시하는 음성 검출기를 포함하고,상기 에코 억제기는 상기 음성 검출기가 상기 제2 통신 신호에 음성 성분이 포함되어 있지 않다고 지시하는 경우에 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 상기 에코 억제기는 바이패스(bypass)를 통해 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 하울링(howling)을 방지하기에 충분한 감쇠 레벨을 제공하도록 상기 에코 억제기를 조절함으로써 상기 에코 억제기가 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 상기 에코 억제기는 단투 스위치(single-throw switch)이고, 상기 에코 억제기는 상기 단투 스위치를 닫음으로써 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 상기 에코 억제기는 클립핑 억제기이고, 상기 에코 억제기는 상기 에코 억제기의 클립핑 임계치를 0으로 설정함으로써 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 상기 에코 억제기는 스케일링 억제기(scaling suppressor)이고, 상기 에코 억제기는 상기 에코 억제기의 스케일링 계수를 1(unity)로 설정함으로써 비활성화되는 에코 억제 장치.
- 제1항에 있어서, 상기 에코 억제기는 하이브리드 억제기이고, 상기 에코 억제기는, 상기 에코 억제기의 클립핑 임계치를 0으로 설정하고 상기 에코 억제기의 스케일링 계수를 1로 설정함으로써 비활성화되는 에코 억제 장치.
- 제1 통신 신호를 감쇠시켜, 제2 통신 신호의 반사에 의해 생기는 상기 제1 통신 신호의 에코 성분을 억제하도록 구성되고, 상기 제1 통신 신호의 적어도 일부에 감쇠 계수를 승산시키는 에코 억제기; 및상기 통신 신호의 우세한 조건(prevailing condition)을 검출하여, 상기 에코 억제기가 활성화되어 있을 때 상기 검출된 우세한 조건에 기초하여 상기 감쇠 계수를 조절하도록 구성된 이득 제어 프로세서를 포함하는 에코 억제 장치.
- 제8항에 있어서, 상기 이득 제어 프로세서는 상기 제1 통신 신호에 근단 음성 성분(near-end speech component)이 포함되어 있는지 여부를 검출하도록 구성된음성 검출기를 포함하고, 상기 이득 제어 프로세서는 상기 음성 검출기가 상기 근단 음성 성분을 검출하는지의 여부에 기초하여 상기 감쇠 계수를 조절하는 에코 억제 장치.
- 제1 통신 신호를 감쇠시켜, 제2 통신 신호의 반사에 의해 생기는 상기 제1 통신 신호의 에코 성분을 억제하도록 구성된 에코 억제기; 및상기 제1 통신 신호의 음성 대 잡음 비율(voice-to-noise ratio)을 검출하도록 구성되고, 상기 비율에 기초하여 상기 에코 억제기에서 제공되는 감쇠의 레벨을 조절하는 이득 제어 프로세서를 포함하는 에코 억제 장치.
- 제10항에 있어서, 상기 음성 대 잡음 비율이 에코 대 잡음 비율인 에코 억제장치.
- 제10항에 있어서, 상기 이득 제어 프로세서는, 상기 비율이 소정의 임계치 이하일 때, 상기 에코 억제기를 비활성화시키는 에코 억제 장치.
- 제12항에 있어서, 상기 에코 억제기는 바이패스를 통해 비활성화되는 에코 억제 장치.
- 제12항에 있어서, 상기 이득 제어 프로세서는 하울링을 방지하기에 충분한 감쇠 레벨을 제공하도록 상기 에코 억제기를 조절함으로써 상기 에코 억제기를 비활성화시키는 에코 억제 장치.
- 제12항에 있어서, 상기 에코 억제기는 단투 스위치이고, 상기 에코 억제기는 상기 단투 스위치를 닫음으로써 비활성화되는 에코 억제 장치.
- 제12항에 있어서, 상기 에코 억제기는 클립핑 억제기이고, 상기 에코 억제기는 상기 에코 억제기의 클립핑 임계치를 0으로 설정함으로써 비활성화되는 에코 억제 장치.
- 제12항에 있어서, 상기 에코 억제기는 스케일링 억제기이고, 상기 에코 억제기는 상기 에코 억제기의 스케일링 계수를 1로 설정함으로써 비활성화되는 에코 억제 장치.
- 제12항에 있어서, 상기 에코 억제기는 하이브리드 억제기이고, 상기 에코 억제기는, 상기 에코 억제기의 클립핑 임계치를 0으로 설정하고 상기 에코 억제기의 스케일링 계수를 1로 설정함으로써 비활성화되는 에코 억제 장치.
- 제10항에 있어서, 상기 에코 억제기는 상기 제1 통신 신호의 적어도 일부에 감쇠 계수를 승산시키고, 상기 이득 제어 프로세서는 상기 에코 억제기의 출력에서의 음성 대 잡음 비율이 소정의 임계치 이하가 되도록 상기 감쇠 계수를 조절하는 에코 억제 장치.
- 제19항에 있어서, 상기 음성 대 잡음 비율이 에코 대 잡음 비율인 에코 억제 장치.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US09/005,144 US6148078A (en) | 1998-01-09 | 1998-01-09 | Methods and apparatus for controlling echo suppression in communications systems |
US09/005,144 | 1998-01-09 | ||
PCT/US1998/026231 WO1999035812A1 (en) | 1998-01-09 | 1998-12-22 | Methods and apparatus for controlling echo suppression in communications systems |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20010033951A KR20010033951A (ko) | 2001-04-25 |
KR100519001B1 true KR100519001B1 (ko) | 2005-10-06 |
Family
ID=21714404
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR10-2000-7007535A KR100519001B1 (ko) | 1998-01-09 | 1998-12-22 | 통신 시스템에서 에코 억제 제어를 위한 방법 및 장치 |
Country Status (13)
Country | Link |
---|---|
US (1) | US6148078A (ko) |
EP (1) | EP1044558B1 (ko) |
JP (1) | JP2002501336A (ko) |
KR (1) | KR100519001B1 (ko) |
CN (1) | CN100502443C (ko) |
AU (1) | AU756390B2 (ko) |
BR (1) | BR9813791B1 (ko) |
DE (1) | DE69820118D1 (ko) |
EE (1) | EE200000415A (ko) |
HK (1) | HK1037077A1 (ko) |
IL (1) | IL137182A (ko) |
TR (2) | TR200100647T2 (ko) |
WO (1) | WO1999035812A1 (ko) |
Families Citing this family (48)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3579245B2 (ja) * | 1998-03-31 | 2004-10-20 | 三洋電機株式会社 | エコーキャンセラの制御方法およびエコー除去装置 |
US6526139B1 (en) | 1999-11-03 | 2003-02-25 | Tellabs Operations, Inc. | Consolidated noise injection in a voice processing system |
US6760435B1 (en) * | 2000-02-08 | 2004-07-06 | Lucent Technologies Inc. | Method and apparatus for network speech enhancement |
US7050575B1 (en) | 2000-06-16 | 2006-05-23 | Ericsson Inc. | Echo canceler coefficient update apparatus and method |
DE10030926A1 (de) * | 2000-06-24 | 2002-01-03 | Alcatel Sa | Störsignalabhängige adaptive Echounterdrückung |
JP3553008B2 (ja) * | 2000-09-26 | 2004-08-11 | 岩崎通信機株式会社 | エコー低減方法および電話装置 |
US6889066B2 (en) * | 2001-03-27 | 2005-05-03 | Qualcomm Incorporated | Network echo suppression in mobile stations |
DE10119277A1 (de) * | 2001-04-20 | 2002-10-24 | Alcatel Sa | Verfahren zur Maskierung von Geräuschmodulationen und Störgeräuschen bei der Sprachübertragung |
GB2375688B (en) * | 2001-05-14 | 2004-09-29 | Motorola Ltd | Telephone apparatus and a communication method using such apparatus |
US6961422B2 (en) * | 2001-12-28 | 2005-11-01 | Avaya Technology Corp. | Gain control method for acoustic echo cancellation and suppression |
US7187656B2 (en) | 2002-05-02 | 2007-03-06 | General Instrument Corporation | Method and system for processing tones to reduce false detection of fax and modem communications |
US7027591B2 (en) * | 2002-10-16 | 2006-04-11 | Ericsson Inc. | Integrated noise cancellation and residual echo suppression |
JP4282317B2 (ja) * | 2002-12-05 | 2009-06-17 | アルパイン株式会社 | 音声通信装置 |
WO2004064365A1 (en) * | 2003-01-08 | 2004-07-29 | Philips Intellectual Property & Standards Gmbh | Device and method for suppressing echo, in particular in telephones |
US7065207B2 (en) * | 2003-09-11 | 2006-06-20 | Freescale Semiconductor, Inc. | Controlling attenuation during echo suppression |
US7046794B2 (en) * | 2003-12-12 | 2006-05-16 | Motorola, Inc. | Double talk activity detector and method for an echo canceler circuit |
US7099458B2 (en) * | 2003-12-12 | 2006-08-29 | Motorola, Inc. | Downlink activity and double talk probability detector and method for an echo canceler circuit |
JP4544040B2 (ja) * | 2004-06-17 | 2010-09-15 | パナソニック株式会社 | エコーキャンセル装置およびそれを用いた電話機、並びにエコーキャンセル方法 |
US7856097B2 (en) * | 2004-06-17 | 2010-12-21 | Panasonic Corporation | Echo canceling apparatus, telephone set using the same, and echo canceling method |
US7395790B2 (en) * | 2004-11-18 | 2008-07-08 | S&S Cycle, Inc. | Reed valve breather for evolution engine |
US8457614B2 (en) | 2005-04-07 | 2013-06-04 | Clearone Communications, Inc. | Wireless multi-unit conference phone |
US20070033030A1 (en) * | 2005-07-19 | 2007-02-08 | Oded Gottesman | Techniques for measurement, adaptation, and setup of an audio communication system |
US20070036342A1 (en) * | 2005-08-05 | 2007-02-15 | Boillot Marc A | Method and system for operation of a voice activity detector |
JP4727542B2 (ja) * | 2006-09-26 | 2011-07-20 | 富士通株式会社 | 電子機器、そのエコーキャンセル方法、そのエコーキャンセルプログラム、記録媒体及び回路基板 |
US9966085B2 (en) * | 2006-12-30 | 2018-05-08 | Google Technology Holdings LLC | Method and noise suppression circuit incorporating a plurality of noise suppression techniques |
US20090043577A1 (en) * | 2007-08-10 | 2009-02-12 | Ditech Networks, Inc. | Signal presence detection using bi-directional communication data |
US7809129B2 (en) * | 2007-08-31 | 2010-10-05 | Motorola, Inc. | Acoustic echo cancellation based on noise environment |
US8199927B1 (en) | 2007-10-31 | 2012-06-12 | ClearOnce Communications, Inc. | Conferencing system implementing echo cancellation and push-to-talk microphone detection using two-stage frequency filter |
US8050398B1 (en) | 2007-10-31 | 2011-11-01 | Clearone Communications, Inc. | Adaptive conferencing pod sidetone compensator connecting to a telephonic device having intermittent sidetone |
JP5156043B2 (ja) * | 2010-03-26 | 2013-03-06 | 株式会社東芝 | 音声判別装置 |
US8447595B2 (en) * | 2010-06-03 | 2013-05-21 | Apple Inc. | Echo-related decisions on automatic gain control of uplink speech signal in a communications device |
CN103430604B (zh) * | 2011-02-21 | 2017-04-19 | 英派尔科技开发有限公司 | 利用带外信息改进无线通信的方法和装置 |
US9002030B2 (en) | 2012-05-01 | 2015-04-07 | Audyssey Laboratories, Inc. | System and method for performing voice activity detection |
US9936290B2 (en) * | 2013-05-03 | 2018-04-03 | Qualcomm Incorporated | Multi-channel echo cancellation and noise suppression |
GB201308247D0 (en) * | 2013-05-08 | 2013-06-12 | Microsoft Corp | Noise reduction |
GB2519392B (en) * | 2014-04-02 | 2016-02-24 | Imagination Tech Ltd | Auto-tuning of an acoustic echo canceller |
EP2999199B1 (en) | 2014-09-16 | 2018-03-07 | Nxp B.V. | Mobile device |
CN105635379B (zh) * | 2015-12-29 | 2020-02-14 | 腾讯科技(深圳)有限公司 | 噪声抑制方法及装置 |
FR3063566B1 (fr) * | 2017-03-06 | 2019-03-22 | Peugeot Citroen Automobiles Sa | Procede et systeme de limitation de volume sonore de telephone de voiture |
JP6338728B1 (ja) * | 2017-03-31 | 2018-06-06 | 日本電信電話株式会社 | エコーキャンセラ装置 |
CN107799123B (zh) * | 2017-12-14 | 2021-07-23 | 南京地平线机器人技术有限公司 | 控制回声消除器的方法和具有回声消除功能的装置 |
US11423921B2 (en) | 2018-06-11 | 2022-08-23 | Sony Corporation | Signal processing device, signal processing method, and program |
JP7187183B2 (ja) | 2018-06-14 | 2022-12-12 | 株式会社トランストロン | エコー抑圧装置、エコー抑圧方法およびエコー抑圧プログラム |
CN111917926B (zh) * | 2019-05-09 | 2021-08-06 | 上海触乐信息科技有限公司 | 一种通信终端中的回声消除方法、装置及终端设备 |
CN110956969B (zh) * | 2019-11-28 | 2022-06-10 | 北京达佳互联信息技术有限公司 | 直播音频处理方法、装置、电子设备和存储介质 |
CN111583087B (zh) * | 2020-05-06 | 2023-09-05 | 杭州小影创新科技股份有限公司 | 一种图像去水印方法 |
CN113763978B (zh) * | 2021-04-25 | 2024-05-03 | 腾讯科技(深圳)有限公司 | 语音信号处理方法、装置、电子设备以及存储介质 |
US20240251039A1 (en) * | 2023-01-20 | 2024-07-25 | Zoom Video Communications, Inc | Hybrid digital signal processing-artificial intelligence acoustic echo cancellation for virtual conferences |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0106640B1 (en) * | 1982-10-15 | 1986-07-16 | British Telecommunications | Noise control circuit |
US5022074A (en) * | 1985-07-01 | 1991-06-04 | Rockwell International Corporation | Digital echo suppressor |
US5157653A (en) * | 1990-08-03 | 1992-10-20 | Coherent Communications Systems Corp. | Residual echo elimination with proportionate noise injection |
US5274705A (en) * | 1991-09-24 | 1993-12-28 | Tellabs Inc. | Nonlinear processor for an echo canceller and method |
JPH07123236B2 (ja) * | 1992-12-18 | 1995-12-25 | 日本電気株式会社 | 双方向通話状態検出回路 |
GB2281680B (en) * | 1993-08-27 | 1998-08-26 | Motorola Inc | A voice activity detector for an echo suppressor and an echo suppressor |
US5475731A (en) * | 1994-01-07 | 1995-12-12 | Ericsson Inc. | Echo-canceling system and method using echo estimate to modify error signal |
GB2295300A (en) * | 1994-11-18 | 1996-05-22 | Motorola Israel Ltd | Hands-free Duplex radio transceiver apparatus and method of training |
JPH08204619A (ja) * | 1995-01-26 | 1996-08-09 | Nec Corp | エコーサプレッサ |
JP2928130B2 (ja) * | 1995-04-19 | 1999-08-03 | 埼玉日本電気株式会社 | ハンズフリー通信装置 |
US6301357B1 (en) * | 1996-12-31 | 2001-10-09 | Ericsson Inc. | AC-center clipper for noise and echo suppression in a communications system |
-
1998
- 1998-01-09 US US09/005,144 patent/US6148078A/en not_active Expired - Lifetime
- 1998-12-22 CN CNB988138581A patent/CN100502443C/zh not_active Expired - Lifetime
- 1998-12-22 BR BRPI9813791-3A patent/BR9813791B1/pt not_active IP Right Cessation
- 1998-12-22 AU AU19077/99A patent/AU756390B2/en not_active Expired
- 1998-12-22 DE DE69820118T patent/DE69820118D1/de not_active Expired - Lifetime
- 1998-12-22 TR TR2001/00647T patent/TR200100647T2/xx unknown
- 1998-12-22 EE EEP200000415A patent/EE200000415A/xx unknown
- 1998-12-22 KR KR10-2000-7007535A patent/KR100519001B1/ko not_active IP Right Cessation
- 1998-12-22 EP EP98963835A patent/EP1044558B1/en not_active Expired - Lifetime
- 1998-12-22 TR TR2000/01904T patent/TR200001904T2/xx unknown
- 1998-12-22 IL IL13718298A patent/IL137182A/en not_active IP Right Cessation
- 1998-12-22 WO PCT/US1998/026231 patent/WO1999035812A1/en active IP Right Grant
- 1998-12-22 JP JP2000528068A patent/JP2002501336A/ja active Pending
-
2001
- 2001-10-22 HK HK01107374.0A patent/HK1037077A1/xx not_active IP Right Cessation
Also Published As
Publication number | Publication date |
---|---|
DE69820118D1 (de) | 2004-01-08 |
WO1999035812A1 (en) | 1999-07-15 |
CN1294814A (zh) | 2001-05-09 |
US6148078A (en) | 2000-11-14 |
KR20010033951A (ko) | 2001-04-25 |
EP1044558B1 (en) | 2003-11-26 |
IL137182A (en) | 2004-09-27 |
IL137182A0 (en) | 2001-07-24 |
AU1907799A (en) | 1999-07-26 |
EE200000415A (et) | 2001-12-17 |
BR9813791A (pt) | 2000-10-03 |
CN100502443C (zh) | 2009-06-17 |
TR200001904T2 (tr) | 2000-11-21 |
AU756390B2 (en) | 2003-01-09 |
HK1037077A1 (en) | 2002-01-25 |
EP1044558A1 (en) | 2000-10-18 |
TR200100647T2 (tr) | 2002-06-21 |
JP2002501336A (ja) | 2002-01-15 |
BR9813791B1 (pt) | 2013-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100519001B1 (ko) | 통신 시스템에서 에코 억제 제어를 위한 방법 및 장치 | |
KR100519002B1 (ko) | 통신 시스템에서 개선된 에코 억제 방법 및 장치 | |
AU758211B2 (en) | Methods and apparatus for providing comfort noise in communications systems | |
US6434110B1 (en) | Full-duplex speakerphone circuit including a double-talk detector | |
US6185300B1 (en) | Echo canceler for use in communications system | |
US6282176B1 (en) | Full-duplex speakerphone circuit including a supplementary echo suppressor | |
US6212273B1 (en) | Full-duplex speakerphone circuit including a control interface | |
US7787613B2 (en) | Method and apparatus for double-talk detection in a hands-free communication system | |
US5598468A (en) | Method and apparatus for echo removal in a communication system | |
JP4282260B2 (ja) | エコーキャンセラ | |
US5764753A (en) | Half-duplex controller | |
US8116448B2 (en) | Acoustic echo canceler | |
US20020181698A1 (en) | Sound communication device and echo processor | |
KR19980086461A (ko) | 핸드 프리 전화기 | |
KR20010072327A (ko) | 에코 제거 시스템에서 마이크로폰의 과부하 영향을경감하기 위한 방법들 및 장치 | |
JP2009021859A (ja) | 通話状態判定装置および該通話状態判定装置を備えたエコーキャンセラ | |
JP2000224081A (ja) | エコーキャンセラ装置 | |
JP2003324787A (ja) | 反響抑圧方法、反響抑圧装置、反響抑圧プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant | ||
FPAY | Annual fee payment |
Payment date: 20120907 Year of fee payment: 8 |
|
FPAY | Annual fee payment |
Payment date: 20130911 Year of fee payment: 9 |
|
FPAY | Annual fee payment |
Payment date: 20150909 Year of fee payment: 11 |
|
LAPS | Lapse due to unpaid annual fee |