2012-04-30 2 views
2

누구나 byte[] 사운드에서 흰색 노이즈를 제거하는 알고리즘을 표시 할 수 있습니까? 나는 안드로이드에 대한 개인 오디오 녹음 애플 리케이션을 위해 일하고 녹음을 위해 안드로이드 API를 사용합니다. 아래는 녹음을 파일에 쓰는 방법입니다 (wav 형식).java - 바이트 배열 wav 파일에서 노이즈 제거

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener() 
{ 
    public void onPeriodicNotification(AudioRecord recorder) 
    { 
     aRecorder.read(buffer, 0, buffer.length); 
     try 
     { 
      fWriter.write(buffer); // Write buffer to file 
      payloadSize += buffer.length; 
      if (bSamples == 16) 
      { 
       for (int i=0; i<buffer.length/2; i++) 
       { // 16bit sample size 
        short curSample = getShort(buffer[i*2], buffer[i*2+1]); 
        if (curSample > cAmplitude) 
        { // Check amplitude 
         cAmplitude = curSample; 
        } 
       } 
      } 
      else 
      { // 8bit sample size 
       for (int i=0; i<buffer.length; i++) 
       { 
        if (buffer[i] > cAmplitude) 
        { // Check amplitude 
         cAmplitude = buffer[i]; 
        } 
       } 
      } 
     } 
     catch (IOException e) 
     { 
      Log.e(AudioRecorder2.class.getName(), "Error occured in updateListener, recording is aborted"); 
     } 
    } 

    public void onMarkerReached(AudioRecord recorder) 
    {} 
}; 

녹화를 재생하는 동안 들릴 수있는 흰색 노이즈를 제거하기 위해 버퍼에 일부 변형을 적용하고 싶습니다. 누군가 알고리즘/링크를 일부 저역 통과 필터 (또는 도움이 될만한 다른 것)를 알고 있다면 도움을 받으십시오.

감사합니다.

+4

, 당신의 사전 처리 단계에서 다음에 할 것이다. 예를 들어 특정 주파수 대역 만 차지한다는 것을 알고 있으면 고주파 노이즈를 제거하는 저역 통과 필터를 사용할 수 있습니다. 그러나 일반적인 해결책은 없습니다. –

+0

나는 또한 같은 소리를 내고있다. 해결책을 찾았습니까? – Manoj

+0

아니요, 나는이 프로젝트를 남겼습니다. 당신이 그것을 찾으면, 여기에 답장을 보내십시오. 그러면 당신의 대답을 받아 들일 것입니다. –

답변

0

저역 통과를 구현하는 가장 간단한 방법은 여러 개의 샘플을 평균하는 것입니다. 출력이 AVERAGE_SAMPLE_COUNT에 의해 짧은 가져, 당신이 볼 수 있듯이

// your sample data array 
int[] samples 
//number of samples you want to average 
int AVERAGE_SAMPLE_COUNT = 3; 

for(int i=0; i<samples.length-AVERAGE_SAMPLE_COUNT; i++){ 
    //variable for storing the values of multiple samples 
    int avgSample = 0; 
    for(int a=0; a<AVERAGE_SAMPLE_COUNT; a++){ 
     //add up the current and the next n samples 
     avgSample += samples[i+a] 
    } 
    //devide by the number of samples to average them 
    avgSample /= AVERAGE_SAMPLE_COUNT; 
    //replace first sample with the averaged value 
    samples[i] = avgSample 
} 

는 유일한 결함이있을 수 있습니다 : 당신이 N 개의 샘플이있는 경우 그래서, 당신은 그런 일을 할 수 있습니다. AVERAGE_SAMPLE_COUNT을 (를) 변경하여 다른 강도의 강도를 쉽게 시험해 볼 수 있습니다. 또한 현재 작동 중입니다. 즉, 초기 입력 데이터가 변경되었음을 의미합니다. 당신이 알고있는 경우

+1

평균화는 매우 열악한 저역 통과 필터를 제공합니다. 또한 대역폭의 2/3을 버리면 오디오 품질이 크게 나 빠지게됩니다. –

+0

감사합니다.이 필터를 구현하고 결과를 확인해 보겠습니다. –

+0

사실 출력의 품질은 원본보다 훨씬 더 나쁩니다. (원래는 "약간"의 잡음이 있습니다. 그래서 잠시 동안 그대로 두겠습니다. 어쩌면 미래에 나는 소리 이론을 깊이 연구 할 것입니다. 꿈 : :) 어쨌든 당신의 대답을 주셔서 감사합니다. –

1

당신은 샘플을 평균 수 : 샘플 주파수 (8,16,32,64,128)와 비트 깊이 (8,16,32)와 채널 기록 (모노, 스테레오).

.wav 오디오는 채널이 교대로 작성되거나 비트 심도의 배열로 인터레이스됩니다. 는

16kHz의 16 비트 ""

64,000 짧은 [] 오디오 초당 16,000 항목과

64kHZ 32 비트 인 INT []이다 (I는 좌측 채널에서 시작) 생각

16 비트 채널을 스테레오에서 모노 (평균 [짧은] [짧은] [홀수])/2로 평균 할 수 있습니다.

평균 16 비트 주파수 128kHz에서 16kHz (8 : 1) 0246810,12,14]/8

평균 16kHZ 주파수가 아마도 더 나쁠 것입니다

오디오가 양자화 된 방법 (아날로그에서 디지털 선형 또는 대수적으로 a-law/u-law/linear)에 따라 다른 방법을 시도해야 할 수도 있습니다.

+0

감사합니다. 나는 모노로 먼저 스테레오를 시도 할 것입니다. (틀린 것이 아니라면 .wav 프레임 (16 비트 깊이)은 2 샘플 (4 바이트)로 구성됩니다 - 오른쪽 채널 1 샘플, 왼쪽 1 샘플) 결과는 모노 출력으로 표시됩니다. –

0

또 다른 방법은 당신이 당신의 오디오 신호에 대해 뭔가를 알고하지 않으면 당신은 백색 잡음을 제거 할 수 없습니다, 일반적으로

recorder.read(data, 0, data.length); 
if(isAudible(data)) { 
    // TODO further processing can go here 
} 

public static boolean isAudible(short[] data) { 
    double rms = getRootMeanSquared(data); 
    return (rms > 198 && 5600 > rms); 
} 

public static double getRootMeanSquared(short[] data) { 
    double ms = 0; 
    for (int i = 0; i < data.length; i++) { 
     ms += data[i] * data[i]; 
    } 
    ms /= data.length; 
    return Math.sqrt(ms); 
}