배경 소음 제거 프로그램을 처음부터 끝까지 어떻게 작성했는지

그렇게 많은 통신 응용 프로그램, 예를 들어 신호와 전보, 어떻게 소리가 통화 중인 다른 사람에게 전해지기 전에 모든 정적 소음과 배경 소음을 제거합니까?
이 회사들은 그들의 소프트웨어에 소음 제거를 포함하는데, 최근의 인코딩 프로젝트에서 나는 이렇게 하고 싶다.
본고에서 나는 내가 무엇을 필요로 하는지, 내가 어떻게 하는지, 그리고 내가 이 과정에서 겪은 장애를 상세하게 소개할 것이다.
내가 환경 소음, 배경 소음, 또는 간단하게 소음을 말할 때, 나는 네가 오디오 파일에서 듣고 싶지 않은 소리를 가리킨다.이런 소리는 오디오 파일이나 소리에 들어오는 신호를 방해할 수 있습니다. 즉, 당신이 듣고 싶은 소리입니다.
내 계획은 소음을 어떤 방식으로 식별하는 것이다. 이렇게 하면 내가 소음을 필터한 다음에 프로그램이 주요 기능을 완성한 후에 소음을 제거한 오디오 파일을 '출력' 파일에 써서 내가 데이터를 비교하고 수집할 수 있다.

연구하다.


이것을 연구하는 것은 매우 어렵다.시간이 좀 걸렸지만 하나 찾았어요tutorial on the Kalman Filter.본고는 칼만 필터를 이해하는 데 필요한 모든 배경 지식을 설명하고 칼만 필터를 설명하며 예시를 제시한다.
칼만 필터는 1차원과 다차원 두 종류가 있다.다비드 칼만 필터는 내가 배워야 할 선형 대수 개념을 포함하고 있다.그래서 저는 선형 대수의 개념을 배우기 시작했고 협방차 행렬과 특징 벡터에 관한 장편 연구 논문에 몰두했습니다.
나는 마침내 선형 대수에 대해 칼만 필터가 필요로 하는 유일한 개념은 행렬, 벡터와 연산이라는 것을 발견했다.나는 또한 협방차 행렬에 대한 유용한 정보를 발견했는데, 이것은 10분 안에 연구 논문에서 묘사한 내용을 해석했다.
또한 Oracleofficial programming guide에서 자바 사운드 API를 배웠기 때문에 자바를 사용하여 칼만 필터를 소리에 적용할 수 있습니다.불행하게도 Java Sound API는 내가 필요로 하는 저급 함수를 제공하지 않습니다.유일하게 유용한 기능은 오디오 파일의 바이트 데이터인데, 이것은 소리를 대표하는 이진 데이터이다.그리고 나서 나는 음파를 확인하고 그곳에서 칼만 필터를 사용해야만 했다.

칼만 필터


칼만 필터는 영원히 확정할 수 없는 대상의 값을 찾을 수 있는 추정 알고리즘이다. '숨겨진 상태' 라고 불리지만, 그 대상을 측정하고 일련의 방정식을 통해 접근함으로써 실제 값을 수렴할 수 있다.
예를 들어 만약에 칼만 필터를 사용하여 청동 트로이 목마의 무게를 찾으려면 그 숨겨진 상태는 200킬로그램(안에 모든 사람이 있기 때문)이고 최종 상태는 198.4킬로그램으로 추정된다. 이것은 일련의 방정식을 통해 측정할 때 얻을 수 있는 것이다.
칼만 필터에서는 측정할 때마다 방정식 업데이트 상태 평가를 사용합니다.그리고 다음 상태 평가치를 예측하여 다음 측정 후에 계산한다.

칼만 필터는 예측 교정 메커니즘을 사용한다.

칼만 필터는 '측정, 업데이트, 예측' 주기에 따른다.

작업 원리


트로이 목마의 예로 돌아가서 초기 추측을 100kg으로 설정하면 됩니다.최초의 추측의 유일한 목적은 순환을 시작하는 것이다.
또한 추산 불확실성의 초기 추측을 설정해야 합니다.다시 말하면 0과 1 사이의 숫자를 사용하면 100킬로그램의 숨겨진 상태가 얼마나 불확실한지 알 수 있다.
그리고 도량, 갱신과 예측 주기의'제0차'교체를 완성한다.이런 최초의 추측은 바로 '추정' 이기 때문에 지금 너는 예측을 해야 한다.아직 측정이 없기 때문에 예측과 예측은 똑같다. 첫 번째 교체에서 사용될 것이다.
  • 트로이 목마를 천평 위에 놓으면'195kg'을 볼 수 있다네 사이즈야
  • 칼만 이득을 계산한다.이 계수가 증가함에 따라 측정값은 더 많은 권한을 부여받고, 감소함에 따라 측정값은 더 적은 권한을 부여받고, 추정값은 더 많은 권한을 부여받는다. 아래와 같다.

  • 칼만 이득 방정식
    칼만 이득은 계산에서 추정 불확정도와 측정 불확정도를 사용한다.측정 불확정도는 0과 1 사이의 상수치로 시작할 때 설정됩니다.
  • 현재 0차 교체(이전 상태 예측)의 예측(100kg)과 현재 측정치(195kg)를 상태 갱신 방정식에 삽입하여 상태 추정치를 얻는다.

  • 상태 업데이트 방정식
  • 다음에 다른 방정식인 협방차로 방정식을 갱신한다. 갱신 예측 불확실성.
  • 마지막으로 칼만 필터 알고리즘의 마지막 두 방정식을 사용하여 다음 추정과 다음 추정의 불확실성을 예측한다.
  • 이것이 바로 1차원 칼만 필터의 주기다.너는 불확실성을 소홀히 해서 일을 더욱 간단하게 할 수 있다.이제 원하는 모든 측정이 완료될 때까지 다른 측정을 수행하고 순환을 계속합니다.
    추정값과 숨겨진 상태를 y값으로 하고, 반복 #을 x값으로 하면 추정값이 진짜 값으로 수렴되는 것을 볼 수 있다.

    칼만 필터의 실현


    kalmanfilter 패키지는 내가 자바 사운드 API로 약간의 실험을 한 후에 개발한 첫 번째 모듈이다.나는 인코딩을 좋아하기 때문에, 심지어는 칼만 필터를 먼저 실현하지 못했다.나는 더욱 간단한 필터를 실현했고'측정, 업데이트, 예측'순환을 따랐다. AlphaFilter, AlphaBetaFilterAlphaBetaGammaFilter.
    테스트 드라이브 개발 후에 저는 예시된 값을 사용하여 이 필터들을 테스트했습니다. 이 값은 같은 사이트에서 왔습니다. 이 사이트는 필터 자체를 가르쳐 주었습니다.kalmanfilter.net.나는 테스트에서 정확한 결정을 내렸다. 왜냐하면 나는 즉시 많은 실패의 테스트에 직면했기 때문이다. 왜냐하면 많은 오류가 있기 때문이다.
    테스트 경험을 얻는 것 외에 유사하고 간단한 필터를 실현하는 것은 내가 칼만 필터를 사용하기 시작하면 발생할 수 있는 오류를 해결하는 데 도움을 주었다.더 간단한 것부터 시작해서, 마지막으로 더 복잡한 필터를 토론할 때, 더 복잡한 버그에 집중하도록 하겠습니다.

    선형 펄스 인코딩 및 음성 처리


    소리 파일은 선형 펄스 인코딩이라고 불리는 형식으로 소리를 숫자로 표시합니다.지정된 샘플링율에서 데이터 바이트는 특정한 진폭으로 그것들이 함께 정현파를 구성하는데 이것이 바로 소리의 표시 방식이다.
    처음에 나는 바이트 데이터 자체가 정현파로 직접 전환할 수 있는 견본이라고 생각했다.오디오 파일이 손상되어 이해할 수 없는 소음이 발생할 때
    내 프로젝트를 두 달여 동안 진행한 후에 나는 스택이 넘치는 알고리즘을 발견했다. 이것은 나로 하여금 [위치별 조작]을 추상화할 수 있게 한다. 이것은 바이트 데이터와 정현파 사이의 중간 단계이고 나는 그것을 어떻게 조작하는지 안다.
    이것들은 모두 매력적이다!a치(진폭)와 그 음량을 증가하고 Math.sin() 내의 승적을 증가하면 음조가 높아진다.그리고 정현파나 음파를 추가하기 위해 float (10진수 데이터 형식) 견본을 조합할 수 있습니다.
    내가 진폭과 그 마이너스를 더하자 나는 예상한 침묵을 얻었다.이것은 상소간섭이라고 불린다. 정현파와 반정현파를 덧붙이는 것이다.수학 용어로 말하자면, 너는 수평선을 얻었고, 음성 용어로 말하자면, 이것은 완전한 침묵이다.

    행렬과 벡터의 모델링


    다차원 칼만 필터는 matrices와 벡터를 사용하는데 전자는 숫자의 직사각형 진열이고 후자는 숫자의 일차원 진열이다.내가 이 일을 하는 것이 가장 재미있다. 왜냐하면 나는 학교에서 이미 소개된 개념을 사용했기 때문이다. 나는 내가 익숙한 자바 문법을 사용했다.
    나는 하나의 행렬을 포함하는 2차원 그룹과 확장 행렬 클래스, 그리고 1차원 그룹을 포함하는 벡터 클래스를 만들었다.
    테스트 드라이브 개발 후에 저는 먼저 매트릭스 테스트 클래스와 벡터 테스트 클래스를 만들었습니다.
    매트릭스 덧셈 테스트에 대해 나는 두 번째 매트릭스에 전송된 첫 번째 매트릭스에 대해 나의 Matrix#add() 방법을 사용했다.그리고 세 번째 Matrix 대상을 만들어서 행렬의 값이 정확한지 확인합니다.
    @Test
    public void testMatrixAddition() {
        Matrix addend = new Matrix(new double[][] { { 1, 2, 3 }, { 4, 5, 6 } });
        Matrix augend = new Matrix(new double[][] { { 10, 14, -8 }, { 3, 1, 5 } });
    
        Matrix sum = addend.plus(augend);
    
        assertArrayEquals(new double[][] { { 11, 16, -5 }, { 7, 6, 11 } }, sum.getMatrixElements());
    }
    
    public Matrix plus(Matrix augend) {
        if (!(getRows() == augend.getRows() && getColumns() == augend.getColumns()))
            throw new IllegalArgumentException("Cannot add matrices of different dimensions");
         Matrix toReturn = new Matrix(new double[getRows()][getColumns()]);
    
        for (int i = 0; i < getRows(); i++) {
            for (int j = 0; j < getColumns(); j++) {
                toReturn.set(i, j, matrixElements[i][j] + augend.getMatrixElements()[i][j]);
            }
        }
    
        return toReturn;
    }
    
    실현Matrix#add을 한 후에 저는 감법, 곱셈, 역구(매우 복잡해서 최종적으로 이를 자신의 클래스에 추출)와 전치 조작을 계속 진행했고 매번 실현되기 전에 테스트를 했습니다.나는 또한 행렬의 성질에 관한 각종 방법을 소개했다. 예를 들면
  • getDeterminant()
  • isSquare()
  • isIdentityMatrix()
  • isInverse(Matrix inverse)
  • 마지막으로 저는 범용 매트릭스 유형을 위해 정적 공장 방법을 실현했습니다. 현재는 단위 매트릭스, 즉 1의 경계는 대각선이고 매트릭스 중의 모든 다른 요소는 0이며 이것은 제곱 매트릭스입니다.예를 들어 3x3 단위 행렬은 [1,0,0], [0,1,0], [0,0,1]이다.

    결실


    내가 모든 Math.random()NullPointerException 를 제거한 후, 프로그램이 완전히 실행되지 않았고, 나는 오디오 파일에 아무런 변화가 없다는 것을 발견했다.

    결론


    환경 소음 제거는 거대한 도전이다. 나는 아직 배경 소음을 제거하는 데 성공하지 못했다.하나, 그러나 그는 경험에서 많은 것을 배웠다. 음성 공학에서 선형 대수, 그리고 자바API까지.
    다음은 코드 링크(소스 오픈!):https://github.com/Ambient-Noise-Remover
    그것 또한 JAR 파일로 제공할 수 있다. 단지 나의 프로그램을 다운로드하기 전에 Java JDK가 설치되어 있는지 확인하기만 하면 된다.
    칼만 필터에 대해 자세히 알고 싶다면, 교과서 사이트 ((https://kalmanfilter.net 를 방문해 보세요. 모든 것을 간단하게 설명하기 때문입니다.
    제 글을 읽어주셔서 감사합니다!너는 복잡한 수학 주제, 예를 들면 선형 대수와 관련된 항목이 있니?댓글에 링크를 남겨주세요!

    좋은 웹페이지 즐겨찾기