2010-12-08 7 views
4

한 샘플링 속도에서 높은 샘플링 속도로 신호 (사운드 샘플)를 리샘플링하려고합니다. 불행히도 어떤 종류의 필터가 필요합니다. 일부 '앨리어싱'이 발생하는 것처럼 보이기 때문에 필터에 익숙하지 않습니다. 다음은 내가 생각해 낸 것입니다 :사운드 샘플을 리샘플링하면 어떤 필터를 사용할 수 있습니까?

int i, j, a, b, z; 

a = 44100; 
b = 8363; 

// upsample by a 
for(i = z = 0; i < samplen; i++) 
    for(j = 0; j < a; j++) 
     cbuf[z++] = sampdata[i]; 

// some filter goes here??? 

// downsample by b 
for(j = i = 0; i < z; i += b) 
    buf[j++] = cbuf[i]; 

새로운 샘플은 원본과 매우 유사하지만 약간의 노이즈가 있습니다. 추가 할 필터를 알려주시겠습니까? 가능하면 필터 관련 코드를 알려주시겠습니까?

오리지널 사운드 : http://www.mediafire.com/?9gnga1in52d6t4x 다시 샘플링 사운드 : http://www.mediafire.com/?x34h7ggk8n9k8z1

+0

시작 대신 [Z]'sampdata [I] '에'cbuf을 설정 '으로 설정 sampdata [I] + (j/(더블) a) (샘프 데이터 [i + 1] - 샘프 데이터 [i])'. 나는 심지어 충분한 근처에 있는지 알고 사운드 프로세싱에 대해 충분히 모르겠지만, 누군가가 당신은 또한 앤티 앨리어스로 다운 샘플링을해야 할 수도 있습니다 :-) 자신의 물건을 알고 사람을 따라 온다 때까지 바쁘게 것입니다. 독립 실행 형 프로그램이 충분하면 –

답변

10

샘플 속도 (소스 및 대상)가 데이터에서 가장 높은 주파수보다 훨씬 높지 않으면 선형 보간을 사용하지 마십시오. 그것은 매우 열악한 로우 패스 필터입니다.

당신이 원하는 것은 저지 대역이 처리중인 두 샘플 속도의 절반보다 낮게 시작하는 보간 저역 통과 필터입니다. 이를 구현하는 일반적인 방법은 IIR 필터를 사용하는 업 샘플링/다운 샘플링과 다상 FIR 필터를 사용하는 것입니다. 실시간 성능이 필요하지 않고 업 샘플링/다운 샘플링을 원하지 않는 경우 Windowed Sinc 인터폴 레이터가이 기능을 잘 수행합니다. Windowed Sinc interpolating low-pass filter in Basic은 C로 변환하는 것이 중요합니다.

IIR 필터링을 사용하려는 경우 다음은 표준 Cookbook for biquad IIR filters입니다.

오디오 리샘플링 이론에 대한 가장 좋은 설명을 보려면 Stanford CCRMA's Resampling page을 참조하십시오.

+0

고맙습니다. 필자는 필터에 대해 아무것도 모릅니다. 그러나 일종의 뮤직 플레이어를 만들고 있기 때문에 런타임 성능이 필요합니다. 솔직히 하나의 샘플링 속도에서 높은 샘플링 속도로 변환하는 것이 복잡 할 것이라고 생각하지 않았습니다. –

+3

@ X-N2O : 결과가 좋게 들리게하려면 단지 복잡합니다. :) – hotpaw2

9

당신은 libsamplerate,이에 대한 전문 라이브러리를 사용하여 생각 해 봤나?

꽤 휴대가 가능하고 이런 일을 올바르게하는 방법을 아는 사람들이 개발했습니다. 직접 사용하지 않더라도 실제로 구현되는 알고리즘을 찾을 수 있습니다.

+3

, 삭스 (http://sox.sourceforge.net/) 또 다른 옵션입니다. 그것은으로. 쉬운 내장 샘플 속도 변환이있다'삭스 파일 1 -r [newsamplerate] file2' – mtrw

2

몇 가지 의견, 난 단지 당신의 실제 의도로 추측하고있어 비록 : 당신은 최대 샘플링 속도로 44100 번 원래의 샘플 속도입니다

  • . 예를 들어, 입력이 10kHz 인 경우 cbuf[] 중간은 441MHz로 대부분의 오디오 분석에서 가장 높습니다. cbuf[]을 44100Hz라고 가정하면 에 44100/OrigSampleRate 개의 샘플을 sampdata[]에 작성하기 만하면됩니다.
  • 업 샘플링 루프에서 z을 두 번 증가시킵니다. 이로 인해 cbuf[]의 모든 홀수 요소가 원래 값을 갖게됩니다. 나는 궁극적으로 최종 buf[] 귀하의 소음의 소스 수있는 잘못된 요소를 가지고 결과 믿습니다. 필요한 수의 요소를 두 번 이상 생성하지 않으면 cbuf에 버퍼 오버플로가 발생할 수도 있습니다.
  • 스티브 (Steve)에 의해 언급 된 바와 같이 선형 보간법은 일반적으로 업 샘플링시 좋은 결과를 생성하는 가장 간단한 방법입니다. 원하는 경우 더 복잡한 업 샘플링을 수행 할 수 있습니다 (다항식, 스플라인 등). 비슷하게, 다운 샘플링을 할 때 단순히 잘라 내기 대신 샘플을 평균 할 수도 있습니다.
+0

아, 내가 z는 두 번 ++ 증가했다 통보하지 않았다. 그 점을 지적 해 주셔서 감사합니다. –

1

최저 리샘플링 코드 내가 지금까지 건너 : http://shibatch.sourceforge.net/

소스를 가지고, 그것에서 무언가를 배우려고. 그것은 불쾌한 상태이지만 그 리샘플러의 결과는 다른 모든 것보다 훨씬 위에 있습니다.

0

더 낮은 샘플 레이트로 다시 샘플링하기 전에 당신이 로우 패스가 원래보다 1.5 배 샘플 속도를 필터링해야하거나 지향 모델의 유물을 소개합니다. 스펙트럼은 샘플 속도의 1/2보다 큰 주파수에서 자체적으로 폴드합니다. 당신이 44100에서 11025로 다시 샘플링 할 경우 재생의 신실 진폭의 -10dB 같은 최대 진폭이 작업을 수행하기 위해 최선을 대역폭이 낮은 감소하기 때문에 그래서 당신은 1/2 11025 또는 5500 Hz에서에서 44,100 lowpassa를 필터링해야합니다. 부호가있는 16 비트의 경우 값은 최대 진폭에 대해 10^(- 10/20) * 2^(16-1) 또는 10362 +/-와 같습니다. 이러한 오래된 아이디어와 기본 아이디어에 대한 지적 재산권이 없어야하므로 정확한 알고리즘을 온라인에서 찾을 수 있습니다. 반올림 배정 밀도 부동 소수점을 사용하지 않고 모든 계산을 수행 한 후 결과를 적절한 정수 값으로 반올림하고 한 세트가 다른 값을 가로채는 정확한 시간 스케일로 보간합니다. 그것은 꽤 상상력과 기억력 그리고 수학자 물리 프로그래머의 영역에 당신을두고 이전의 경험이 필요합니다. : -O 간단한 선형 보간 :-)

관련 문제