DirectSound로 밴드 필터링을 쉽게 할 수 있습니까? 그렇지 않다면 어떻게 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/258667

문제

이와 같은 것이 가능하고 (그리고 상대적으로 쉽게 할 수 있는지) 궁금합니다. 그렇다면 어떻게 할 수 있습니까?

재현중인 웨이브 파일에서 밴드 필터링을하고 싶습니다. 대부분의 WinAMP와 같은 응용 프로그램에서 볼 수있는 "이퀄라이저"와 유사한 것.
그러나 내 아이디어는 사운드를 평등하게하는 것이 아니라 매우 높은 음수 DB 값을 사용하여 필터링하는 밴드를 거의 죽이는 것입니다.

첫 번째 질문은 : DirectSound가 저에게 이것을 할 수있는 무언가를 주는가?
그렇지 않다면 : 어떻게 이것을 구현 하시겠습니까?
샘플링 된 파형에서 빠른 푸리에 변환을 사용하여 주파수 분포로 변환 할 수 있다는 것을 알고 있습니다. 이제 특정 주파수의 진폭 값을 변경 한 후에는 해당 분포에서 원래 파형으로 되돌아 갈 수 없습니다 :-)

어떻게 이런 일을 할 수 있습니까?

또한이 필터를 얼마나 정확하게 만들 수 있습니까? (2250Hz에서 2275Hz에서 2275Hz에서 2275Hz까지 필터링하고 싶다면 필터가 가질 수있는 오류는 무엇입니까? 내가 얻을 수있는 최대 정밀도는 무엇입니까?)

감사!

도움이 되었습니까?

해결책

DirectSound 가이 기능을 제공하는지 여부는 모르겠습니다. DSP가 상당히 복잡하고 종종 상황마다 크게 다르기 때문에 그렇지 않다고 생각합니다. 원하는 것은 일반적으로 DSP (디지털 신호 처리)에서 "필터링"이라고합니다. 여러 번 여기에는 FIR (유한 임펄스 응답) 필터를 사용하는 것이 포함됩니다. 당신이 원하는 것을 정확하게 할 수있는 많은 라이브러리가 있습니다. 필터 디자인의 가장 까다로운 측면은 속도, 정확성 및 오류가 항상 트레이드 오프가 있다는 것입니다. 예에서는 주파수 사이의 신호를 제거 할 수 있지만 주변 주파수에도 영향을 미칩니다. 영향을 미치는 양은 처리 시간 및 필터 설계와 관련이 있습니다.

아마도 여기에서 시작합니다 (수학 중장) : 전나무 필터

그런 다음 Google은 자신의 Windows/DirectSound 특정 전나무 관련 정보를 찾으십시오.

다른 팁

DirectSound는 내가 아는 한 여기에서 설명하는 것처럼 대역 필터링을 수행하지 않습니다.

대역 통과 필터링의 일반적인 아이디어는 지정된 지연 시간과 감쇠 (또는 감쇠) 요소로 신호 출력을 가져 와서 입력 스트림으로 다시 공급하는 지연 라인을 사용하는 것입니다. 필터를 신중하게 설계하면 오디오 소스에서 특정 주파수 범위를 증폭 시키거나 감쇠시킬 수 있습니다. 이 기술은 필터 효과를 테스트하는 동안 진단 도구를 제외하고는 FFT를 사용하지 않습니다. FFT 기술은 주파수를 제한하거나 증폭시키는보다 정확한 작업을 수행하지만 지연 라인은 일반적으로 더 빠르며 코딩하기 쉽습니다.

WAV 파일을 처리하려면 (실시간 합성/필터링을 수행하는 것과 달리) 오디오 버퍼에서 지연 라인을 실행하는 것은 다음과 같이 간단합니다.

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

실제로는 이보다 조금 더 복잡합니다 (예 : 잠재적 인 오버플로 값을 처리해야하며 일부 유형의 지연 라인은 반대로 실행되어야합니다. 물론 C 스타일 코딩의 통증입니다).

필터가 얼마나 정확한 지에 따라, 그것은 그것이 얼마나 잘 설계되었는지에 달려 있습니다 (매우 어렵습니다). 지연 라인을 사용하여 필터를 설계 할 때는 저렴한 마이크로 프로세서보다 전기 엔지니어가 수십 년 동안 한 것과 동일한 작업을 수행하고 있습니다.

DirectSound는 신호 처리 시설을 전혀 제공하지 않습니다. 원하는 작업을 수행하는 데 사용할 수있는 다양한 기술이 있습니다. FFT를 사용하여 원하는 작업을 수행 할 수는 있지만 아마도 가장 좋거나 가장 쉬운 방법은 아닙니다. 오디오 DSP, 특히 디지털 필터링 (IIR, FIR)을 읽어야합니다. 무료로 온라인으로 제공되는 좋은 DSP 책이 있습니다. 디지털 신호 처리에 대한 과학자 및 엔지니어 안내서 확실히 볼만한 가치가 있습니다. 아마존에서 구할 수있는 다른 좋은 DSP 책도 많이 있습니다.

나는 이런 종류의 일을 직접 돌보는 도서관을 모른다.

푸리에 변환으로 원하는 것을 달성 할 수 있습니다. fftw 당신을 위해 계산하는 일을하십시오. 그러나 내 경험에서 내 경험에서는 일하기가 매우 불쾌하고, 특히 한 번의 히트로 더 긴 비트의 오디오를 처리하려는 경우 엄청난 양의 기억을 사용하십시오.

FFT를 사용하여 EQ를 적용하는 기본 아이디어는 다음과 같습니다.

  1. 오디오를 얻으십시오. 오디오는 스피커 콘 / 시간이 지남에 따라 매우 긴 값 (샘플) 배열 일뿐입니다.
  2. 오디오의 푸리에 변환을 취하십시오 (Libary는이 작업을 수행하지만 오디오 샘플을 올바른 형식으로 분쇄해야합니다. 이것은 시간 기반 샘플을 주파수 기반 표현으로 변환합니다 - 본질적으로 이것은 신호를 변환하여 혼란을 나타냅니다. 신호의 주파수.
  3. 주파수 분산을 나누십시오 - 분산을 영역으로 분할하면 각 영역은 다양한 주파수가됩니다.
  4. 그런 다음 주파수 대역에서 조정을 수행 할 수 있습니다. 예를 들어, 한 영역을 제로하여 모든 흔적을 제거 할 수 있습니다.
  5. 업데이트 된 주파수 산만의 역 푸리에 변환을 취하십시오. 이렇게하면 표현을 시간 영역으로 반환하여 원래 신호의 (근사)를 재구성하지만 조정 한 조정이 있습니다.

이와 같은 일을하면 오디오에 존재하는 주파수를 정확하게 조작 할 수 있습니다. 그러나 구현하는 것이 간단하지 않다는 경고를받습니다.

나는 주제에 관한 독서를 추천한다. 비트 감지는 많은 것과 밀접하게 연결되어 있습니다 (기본 기술을 많이 사용) - 처음 몇 섹션을 시도하십시오. 여기 시작으로.

조금 도움이되기를 바랍니다.

DirectSound는 직접적으로 지원하지 않을 수도 있지만 DirectShow는해야합니다. 대신 그 API를 사용할 수 있습니까?

두 번째 전나무 필터 아이디어. 좁은 노치를 얻으려면 긴 필터 커널이 필요합니다.

기본적으로 값 세트 (커널)에 대한 입력 스트림의 컨볼 루션을 사용합니다. 모든 출력 샘플은 필터 커널의 상응하는 항목과 함께 이전 N 샘플의 합계입니다.

따라서 동일한 수의 샘플의 커널 배열과 FIFO 또는 원형 버퍼를 유지해야합니다.

웹의 전나무 필터 커널 계산기, Google "전나무 필터 계산기"입니다.

FFT를 수행하고 주파수 도메인 (스케일링 주파수 빈)에서 엉망이 된 다음 시간 도메인 신호를 복구하기 위해 IFFT를 수행 할 수 있어야합니다. 그렇지 않으면 SCOPEFIR 또는 MATLAB을 사용하여 필터를 설계하는 것은 매우 쉽습니다. Scopefir는 밴드 스톱 필터를 쉽게 설계하고 계수를 제공하여 신호에 대한 컨볼 루션을 수행 할 수 있습니다. 다음은 Scopefir 웹 사이트의 자습서입니다. http://www.iowegian.com/fir/tutor/firintro.htm

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top