2010-01-17 1 views
2

SpeakHere 샘플 응용 프로그램을 시작점으로 사용하여 iPhone 사운드 처리 응용 프로그램을 구현하려고합니다. 이 응용 프로그램은 재생 중에 버퍼링 된 오디오 샘플을 조작하는 작업을 포함합니다. 샘플에 소수를 곱하면 (예를 들어 0.9) 결과적으로 노이즈가 발생합니다. 가장 이상한 점은 샘플에 정수 (1.0, 2.0 등)를 곱하거나 예상 값대로 재생 사운드를 더하거나 뺄 때입니다. 전체 프로젝트는 여기에서 다운로드 할 수AudioQueueBuffer 오디오 데이터를 조작하면 노이즈가 발생합니다.

//------------------ 
    //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine. 
    short *buffer = (short *)calloc(1, numPackets * 2); 
    memmove(buffer, bufferReference->mAudioData, numPackets * 2); 
    for (int i = 0; i < numPackets; i++) 
    { 
    buffer[i] *= 0.9; 
    //buffer[i] *= 1.0; 
    //buffer[i] += 10.0; 
    } 
    memmove(bufferReference->mAudioData, buffer, numPackets * 2); 
    free(buffer); 
    buffer = NULL; 
    //------------------- 

:

나는 다음과 같은 코드를 가진 AudioPlayer.m의 playbackCallback 기능에하고 있어요 http://depositfiles.com/files/lmnkq68n8

는 사람이 누구인지 날 지점 수 내가 잘못하고있어? 나는 이미 며칠 동안 그것에 고생하고 있었고, 나는 완전히 잃어 버렸습니다.

감사합니다.

답변

0

게시자가 게시 한 스 니펫을 읽으면 파일 번호가 16 비트 정수 (짧은 값)에 0.9를 곱하고있는 것처럼 보입니다 (파일을 호스팅하는 사람은 항상 모든 슬롯이 가득하다고 알려줍니다) 부동 소수점 값). 이것은 암시 적으로 짧게 캐스트합니다. 따라서 소수점 뒤에있는 모든 것을 풀면 신호에서 aliasing effects이됩니다.

업데이트 :
코드를 검사했지만 그 소음의 출처를 파악할 수 없었습니다.
왜 memmove를 사용하여 버퍼를 조작하고 있습니까? 너무 소음이 발생 내가 알고 싶은데요

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; 

:
직접와 버퍼에 액세스 할 수 있습니다. 만약 당신이 그것을 발견한다면, 여기에 해결책을 게시하십시오. (어쩌면 Core Audio mailing list의 누군가가 도울 수 있습니다.) 그들은 실제로 도움이됩니다.

단지 이득을 변경해야한다면 간단히 AudioQueueSetParameter을 사용할 수 있습니다.
또 다른 옵션은 AudioQueueServices 대신 입니다.

+0

나는 호스팅 다른 파일을 다시 업로드했습니다. 플로트를 반바지로 캐스팅하는 데 문제가없는 것 같습니다. 오디오 샘플의 진폭 범위가 -32768 ~ 32767 인 경우 소수점 이후의 값은별로 중요하지 않습니다. 0.9를 곱하면 사운드가 더 조용 해지지만 화이트 노이즈가 발생합니다. – Thorny

+0

프로젝트를 다시 업로드 해 주셔서 감사합니다. 나는 나의 대답을 업데이트했다. –

+0

감사합니다.이 질문을 핵심 오디오 메일 링리스트에 게시하겠습니다. – Thorny

0

이것은 아마도 버퍼 빅 엔디안 형식을 시스템 리틀 엔디 언 형식으로 변환하여 곱하기에 대한 것으로 버퍼에 다시 빅 엔디안으로 저장하는 문제 일 수 있습니다. http://www.filefactory.com/file/a2c9c30/n/Speak_Here.zip :

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; 
 
for (int i=0; i<44100; i++) { 
 
     sample = CFSwapInt16BigToHost(pBuffer[i]); 
 
     newSample = sample * 0.1; 
 
     pBuffer[i]=CFSwapInt16HostToBig (newSample); 
 
    }