FFT 또는 DFT를 사용하여 오디오를 다시 샘플링하는 방법


12

먼저 FFT를 수행 한 다음 필요한 결과의 일부만 취한 다음 역 FFT를 수행하여 음성 오디오를 다운 샘플링합니다. 그러나 32768에서 8192까지 다운 샘플링과 같이 2의 거듭 제곱 주파수를 사용하는 경우에만 제대로 작동합니다. 32k 데이터에서 FFT를 수행하고 데이터의 상위 3/4를 버린 다음 나머지 1/4의 역 FFT.

그러나 올바르게 정렬되지 않은 데이터 로이 작업을 수행하려고 할 때마다 다음 두 가지 중 하나가 발생합니다. 샘플이 2의 거듭 제곱이 아니기 때문에 사용중인 수학 라이브러리 (Aforge.Math)가 적합합니다. 샘플을 제로 패딩하여 2의 거듭 제곱을 시도하면 다른 쪽 끝이 횡설수설됩니다. 또한 DFT를 대신 사용하려고 시도했지만 결국 속도가 느려졌습니다 (실시간으로 수행해야 함).

초기 FFT와 끝의 역 FFT 모두에서 FFT 데이터를 올바르게 제로 패딩하려면 어떻게해야합니까? 16khz에 도달 해야하는 44.1khz의 샘플이 있다고 가정하면 현재 샘플 크기는 1000입니다.

  1. 마지막에 입력 데이터를 1024로 채 웁니다.
  2. FFT 수행
  3. 처음 512 개의 항목을 배열로 읽습니다 (처음 362 개만 필요하지만 ^ 2 필요)
  4. 역 FFT 수행
  5. 오디오 재생 버퍼로 처음 362 개의 항목 읽기

이것으로 나는 결국 쓰레기를 얻습니다. 이미 ^ 2 인 샘플로 인해 1 단계와 3 단계에서 패딩 할 필요없이 동일한 작업을 수행하면 올바른 결과를 얻을 수 있습니다.

c#  audio 

9
FFT는 실제로 올바른 방법이 아닙니다. 최대 효율을위한 다상 필터 뱅크가 필요하지만 문제를 해결하려면 먼저 GCD로 업 샘플링 한 다음 저역 통과로 다운 샘플링하십시오.
Bjorn Roche

안녕 비요른 : "GCD"는 무엇입니까?
SpeedCoder5

답변:


16

첫 번째 단계는 시작 샘플 속도와 대상 샘플 속도가 모두 합리적인지 확인하는 것입니다 . 정수이기 때문에 자동으로 합리적인 숫자입니다. 그중 하나가 합리적인 숫자가 아니라면 여전히 샘플 속도를 변경할 수는 있지만 훨씬 다른 프로세스이며 더 어렵습니다.

2232527227533272255

데이터를 어떻게 리샘플링하든 관계없이 이전 단계를 수행해야합니다. 이제 FFT로하는 방법에 대해 이야기 해 봅시다. FFT로 리샘플링하는 요령은 모든 것이 잘 작동하도록 FFT 길이를 선택하는 것입니다. 즉, 데시 메이션 비율 (이 경우 441)의 배수 인 FFT 길이를 선택해야합니다. 예를 들어, FFT 길이 441을 선택하지만 882 또는 1323 또는 441의 다른 양의 배수를 선택할 수 있습니다.

이것이 어떻게 작동하는지 이해하려면 그것을 시각화하는 데 도움이됩니다. 주파수 영역에서 아래 그림과 같은 오디오 신호로 시작합니다. 44.1 kHz 샘플 레이트

처리가 끝나면 샘플 속도를 16kHz로 낮추고 싶지만 가능한 적은 왜곡을 원합니다. 다시 말해, 위 그림의 모든 것을 -8 kHz에서 +8 kHz로 유지하고 다른 모든 것을 버리고 싶을뿐입니다. 결과는 아래 그림과 같습니다. 여기에 이미지 설명을 입력하십시오

샘플 속도는 스케일이 아니며 개념을 설명하기 위해 있습니다.

255

의심 할 수 있듯이 몇 가지 잠재적 인 문제가 있습니다. 나는 각각을 통해 당신이 그들을 극복 할 수있는 방법을 설명합니다.

  1. 데이터가 데시 메이션 계수의 좋은 배수가 아닌 경우 어떻게해야합니까? 데시 팩터의 배수로 만들기 위해 데이터의 끝을 충분한 0으로 채우면이를 쉽게 극복 할 수 있습니다. 데이터는 FFT되기 전에 채워집니다.

  2. ll10 (데이터 샘플 수와 패딩 샘플 수는 모두 데시 메이션 팩터의 양의 배수 여야 함-이 제약 조건을 충족시키기 위해 패딩 길이를 늘릴 수 있음), 패딩 된 데이터를 FFT ' 데이터 및 필터를 사용한 다음 고주파수 (> 8kHz)를 앨리어싱하면 고주파수 결과를 삭제하기 전에 저주파수 (<8kHz) 결과로 내려갑니다. 불행히도 주파수 영역에서의 필터링은 그 자체로 큰 주제 이므로이 답변에서 더 자세히 설명 할 수는 없습니다. 그러나 두 개 이상의 청크로 데이터를 필터링하고 처리하는 경우 필터링을 계속하려면 오버랩 및 추가 또는 오버랩 및 저장 을 구현해야합니다 .

이게 도움이 되길 바란다.

편집 : 주파수 도메인 샘플의 시작 수와 주파수 도메인 샘플의 대상 수 사이의 차이는 결과의 양의 측에서 결과의 음의 측과 동일한 수의 샘플을 제거 할 수 있도록 짝수해야합니다. 이 예의 경우, 샘플의 시작 수는 데시 메이션 비율 또는 441이고, 대상 샘플 수는 보간 속도 또는 160입니다. 차이는 279이며 짝수는 아닙니다. 해결 방법은 FFT 길이를 882로 두 배로 늘리는 것이므로 대상 샘플 수도 320으로 두 배가됩니다. 이제 차이가 고르고 문제가없는 적절한 주파수 도메인 샘플을 제거 할 수 있습니다.


아주 좋아요 짐을 어떻게 그렇게 멋진 인물로 만들고 있습니까?
Spacey

@Mohammad 저는 보통 Powerpoint를 사용합니다. 이 경우 저는 Libre Office 버전의 Powerpoint를 사용했습니다.이 버전을 "Impress"라고합니다.
Jim Clay

안녕하세요, 당신의 요점에 대한 질문이 있습니다 (2). 이 단계에서 정확히 무엇을 의미합니까? "... 그리고 고주파수 (> 8 kHz)의 앨리어싱은 고주파수 결과를 삭제하기 전에 저주파수 (<8 kHz) 결과로 내려갑니다." 나는 그 전에 단계를 이해합니다. f- 도메인 데이터와 필터의 f- 도메인을 곱한 후 무엇을해야합니까? 또한 데이터를 업 샘플링하려는 경우에도이 방법이 작동합니까? 감사합니다.
TheGrapeBeyond

@TheGrapeBeyond 시간 도메인에서 별칭을 지정하면 모든 Nyquist 영역이 함께 추가됩니다. 모든 Nyquist 구역의 첫 번째 요소가 함께 추가되어 첫 번째 Nyquist 구역의 새로운 첫 번째 요소가됩니다. 모든 Nyquist 구역의 두 번째 요소가 함께 추가되어 첫 번째 Nyquist 구역 등의 새로운 두 번째 요소가됩니다.
Jim Clay

흠, FFT 기반 리샘플링을 수행하는 방법을 잘 모르겠습니다. 여기서 시도하면 매우 이상한 결과가 나옵니다. 나는 그것에 대해 질문을 할 것입니다.
TheGrapeBeyond

3

위의 답변이 실제로 완료되었지만

다음은 요점입니다.

  1. 신호를 다운 샘플링하려면 정수 여야합니다. 신호를 다운 샘플링하기 전에 신호를 필터링해야합니다.
  2. 신호를 먼저 업 샘플링 / 보간하여 합리적인 숫자 다운 샘플링을 달성 할 수 있습니다.
  3. 업 샘플링은 단순히 0을 삽입 한 다음 신호를 필터링하는 것입니다.
  4. 3/4 샘플 속도를 달성합니다. 모든 신호 샘플 사이에 4 개의 0을 삽입하여 신호를 업 샘플링합니다. 필터를 적용하십시오. 그런 다음 신호를 필터링하고 4 개의 신호 샘플 중 3 개마다 삭제하십시오.

이것에 대한 세부 사항 :

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

또한 반드시 필요한 경우가 아니면 FFT를 컴퓨터로 계산하여 IFFT를 계산하지 마십시오. 프로세스 속도가 매우 느리고 대부분의 신호 처리 작업에 부적합한 것으로 간주됩니다. FFT는 일반적으로 주파수 영역에서만 문제를 분석하거나 신호 처리를 적용하는 데 사용됩니다.


1

비요른 로슈 (Bjorn Roche)가 말했듯이, FFT를 사용하는 것은 끔찍하게 비효율적입니다. 그러나 여기서는 주파수 영역에서 업 샘플 필터 및 다운 샘플링 방법을 사용하여 매우 간단한 방식으로 진행됩니다.

1-길이 N의 원하는 벡터 신호를 가져옵니다.

2-N 포인트 FFT를 수행합니다.

3-0은 FFT 벡터의 중간에 160 * N 0으로 FFT를 채 웁니다.

4-IFFT 수행

5-다른 440을 폐기하는 441 개의 샘플 중 하나를 선택하십시오.

길이 N * 160 / 441의 벡터가 남게되며 이는 리샘플링 된 신호입니다.

보시다시피 대부분의 결과가 버려지기 때문에 많은 무의미한 계산을하고 있습니다. 그러나 FFT를 수행하는 코드에 액세스 할 수 있다면 실제로 약간 조정하여 버릴 수있는 IFFT 결과 만 계산할 수 있습니다.

도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.