2010-05-18 7 views
3

저는 C++에서 PCM WAV 파일을 지원하는 파일 압축 유틸리티를 작성하고 있습니다. 그러나이를 PCM 인코딩으로 유지하고 더 낮은 샘플 속도로 변환하여 스테레오에서 모노로 변경하려고합니다. 적용 가능한 경우 파일 크기를 줄입니다.프로그래밍 방식으로 WAV로 변환

실제 사운드 데이터가 작동하는 방식에 대한 경험이나 지식이 없지만 WAV 파일 헤더를 이해합니다. 그래서 내 질문은 상대적으로 프로그램 적으로 WAV 파일의 "데이터"하위 덩어리를 조작하여 다른 샘플 속도로 변환하고 채널 번호를 변경하거나 기존 라이브러리를 사용하여 훨씬 더 나을 것이라고 생각합니다. ? 그렇다면 어떻게 될 것입니까? 미리 감사드립니다.

답변

1

나는 당신이 당신의 개인적인 학습을 위해 그것을하고 싶지 않다면 휠을 재발 명할 필요가 있다고 생각하지 않는다. 예를 들어 사용하려고 시도 할 수 있습니다. libsnd

+0

일반적으로 가능한 경우 내 프로그램에서 미니멀리즘을위한 것이므로 약간의 형식을 알고 있으면 좋을 것입니다. 나에게 샘플 속도와 채널을 변경하는 것이 상대적으로 쉽지만, 물론 틀릴 ​​수도 있습니다. – kaykun

+0

자신의 오디오 프로세싱 코드를 굴린 후에는 프로그램이 "최소"가되지 않습니다. 라이브러리를 사용하는 경우, 어쨌든 이미 라이브러리를 가지고 있으며 몇 줄의 코드를 호출 할 가능성이 있습니다. –

4

PCM은 원래 신호의 값이 등거리 지점에서 샘플링된다는 것을 의미합니다.

스테레오의 경우 두 값의 시퀀스가 ​​있습니다. 이들을 모노로 변환하려면 두 시퀀스의 조각 평균을 취하면됩니다.

낮은 샘플링 속도로 신호를 리샘플링하는 것은 조금 더 까다 롭습니다. 앨리어스 (가짜 저주파 신호)가 생성되지 않도록 신호에서 고주파수를 필터링해야합니다.

2

나는 avakar와 nico에 동의하지만 좀 더 설명을 추가하고 싶습니다. 두 가지에 해당하지 않는 한 PCM 오디오의 샘플 속도를 낮추는 것은 사소한되지 않습니다 :

  1. 귀하의 신호는 1/2보다 더 중요한 주파수 낮은 포함하는 새로운 샘플링 속도 (Nyquist rate). 이 경우 앤티 앨리어싱 필터가 필요하지 않습니다.

  2. 정수 값으로 다운 샘플링합니다. 이 경우, N에 의한 다운 샘플링은 모든 N 번째 샘플을 유지하고 나머지를 제거하는 것을 요구한다.

이러한 사항이 사실이라면 일정한 간격으로 샘플을 내려서 샘플링하면됩니다. 그러나 합성 신호 이외의 다른 신호를 처리하는 경우에는 둘 다 맞지 않을 수 있습니다.

문제 1을 해결하려면 오디오 샘플을 저역 통과 필터로 필터링하여 결과 신호가 새 샘플링 속도의 최대 1/2 주파수 내용 만 포함하는지 확인해야합니다. 이것이 수행되지 않으면 높은 주파수가 정확하게 표시되지 않고 적절하게 표현 될 수있는 주파수로 다시 별칭을 지정하여 큰 왜곡을 일으 킵니다. 앨리어싱에 대한 설명은이 위키 백과 문서의 critical frequency 섹션을 확인하십시오. 특히, 샘플링 속도가 너무 낮기 때문에 샘플만으로 구별 할 수없는 3 가지 신호를 보여주는 그림 7을 참조하십시오.

어드레싱 문제 2는 여러 가지 방법으로 수행 할 수 있습니다. 때로는 업 샘플링과 다운 샘플링의 두 단계로 수행되기 때문에 샘플링 속도를 합리적으로 변경합니다. 보간 또는 다른 기술을 사용하여 수행 할 수도 있습니다. 근본적으로 해결해야 할 문제는 새로운 신호의 샘플이 원래 신호의 샘플과 시간을 맞추지 않는다는 것입니다.

오디오에서 리샘플링이 상당히 복잡 할 수 있으므로 nico의 조언을 듣고 기존 라이브러리를 사용합니다. 필터 단계를 올바르게 시작하려면 신호 처리 및 주파수 분석에 대해 많은 것을 배워야합니다.전문가 일 필요는 없지만 시간이 좀 걸립니다.

관련 문제