2008-09-15 1 views

답변

5

FFT (Fast-Fourier Transforms)가 실제로 포함될 것입니다. FFT를 사용하면 고정 된 주파수와 다양한 진폭의 간단한 사인파의 합계로 모든 아날로그 신호를 근사 할 수 있습니다. 기본적으로 샘플을 취하여이를 진폭 -> 주파수 쌍으로 분해 한 다음 최대 진폭에 해당하는 주파수를 취하는 것입니다.

바라건대 또 다른 SO 독자가 이론과 코드 사이에 남겨두고있는 간격을 채울 수 있기를 바랍니다!

+3

이 방법은 특히 음악 맥락에서 심각한 정확성에 문제가 ... 좋은 결과를 제공하지 않습니다. endolith가 지적한 것처럼 FFT는 다양한 주파수 범위에서 강도를 제공합니다. 범위는 FFT 창 크기가 작을수록 더 빠릅니다.더 나쁜 경우, 전체 범위는 0에서 44100 Hz (레드 북 오디오의 경우)이며 일반적인 음표는 거의 항상 1000Hz보다 훨씬 낮기 때문에 고주파 대역에서 대부분의 해상도가 낭비됩니다. – MusiGenesis

1

DFT을 적용한 다음 결과에서 기본 빈도를 추출하십시오. DFT 정보를 검색하면 필요한 정보를 얻을 수 있습니다. 몇 가지 정보를 연결해 드리지만, 수학 지식에 대한 기대가 크게 다릅니다.

행운을 비네.

4

기타 튜너는 FFT 또는 DFT를 사용하지 않습니다. 보통 그들은 제로 크로싱을 계산합니다. 일부 파형은 다른 파형보다 더 많은 제로 크로싱을 가지기 때문에 기본 주파수를 얻을 수는 없지만 일반적으로 기본 주파수의 배수를 얻을 수 있습니다. 그것은 하나 이상의 옥타브가 될지 모르지만 노트를 얻는 것으로 충분합니다.

제로 크로싱을 계산하기 전에 저역 필터링을 수행하면 일반적으로 초과 제로 크로싱을 제거 할 수 있습니다.

당신이 입력 배열의 원시 PCM으로 시작하는 경우는, 당신이 기본적으로해야하는 것은 그래프는 다음과 같습니다

+2

나는 그것들이 제로 크로싱을 셀 수 있을지 의심 스럽다. 일반적인 기타 파형에는 사이클 당 많은 제로 크로싱이 있습니다. http://www.flickr.com/photos/[email protected]/4180888094/ 그들은 아마도 간단한 자기 상관을 할 것입니다. – endolith

+1

단순한 튜너의 경우 더 많은 제로 크로싱이 중요하지 않습니다. 튜너가 근본의 정확한 주파수를 필요로하지 않는다는 것을 기억하십시오. 메모를 알아야합니다. 사이클 당 더 많은 제로 크로싱을 세면 더 높은 옥타브에 고정 될 수 있지만 Cb는 여전히 Cb가되고 너무 높은 두 센트는 여전히 두 센트가됩니다. 자기 상관은 고급 처리에는 적합하지만 튜너에게는 과잉입니다. – Mendelt

4

이 더 구체적으로 약간 있지만 로우 패스 필터를 조정하면 탐지 할 주파수 범위의 일부 knowlegde이 필요 파동 진폭과 시간의 비교. FFT를 수행하면 입력 샘플링 속도의 0에서 1/2까지의 주파수에 대한 주파수 막대 그래프로 변환됩니다. 결과 배열의 각 항목 값은 해당 하위 주파수의 '강도'입니다.

FFT(N, input, output); 
max = max_i = 0; 
for(i=0;i<N;i++) 
    if (output[i]>max) max_i = i; 
root = S/2.0 * max_i/N ; 
+0

간결함을 좋아하지만 for 루프의 문제가 의심됩니다. 출력은 반드시 입력과 동일한 크기가 아닐 것입니다. – Waslap

+0

정확히 같은 크기입니다. FFT를 수행하는 것은 절충점입니다. 큰 시간 범위를 분석해야만 정밀한 주파수 해상도 (많은 출력 빈)를 가질 수 있습니다. 분석을 매우 정확한 시간 (작은 입력 샘플 크기)으로 제한하면 주파수 영역에서 낮은 해상도를 얻게됩니다. – AShelly

17

시간을 기반으로하는 다른 알고리즘도있다 아닌 주파수 기반 :

그래서 제 S 샘플/샘플링 크기 N의 입력 배열 주어진 루트 주파수를 찾는 방법. 자기 상관은 피치 검출을위한 비교적 간단한 알고리즘입니다. 참조 : http://cnx.org/content/m11714/latest/

나는 자기 상관 및 다른 알고리즘을 읽을 수있는 C# 구현을 작성했습니다. http://code.google.com/p/yaalp/을 확인하십시오.

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio 파일을 나열하고 PitchDetection.cs는 원하는 파일입니다.

(프로젝트는 GPL이므로 코드를 사용하는 경우 해당 용어를 이해하십시오.)

+2

이 답변을 여러 번 투표하고 싶습니다. FFT는이 문제에 대한 끔찍한 해결책입니다. 그것은 식료품 점에 탱크를 운전하는 것과 같습니다. 확실히, 그것은 멋지다. 그러나 그것은 정말로 최고의 길이 아니다. 자기 상관은 일반적으로이 문제에 대한 올바른 해결책으로 간주됩니다. 즉 Autotune/Melodyne/Singstar/당신의 이름입니다. 제로 크로싱 (Zero Crossing) 기반의 솔루션은 오직 당신이인지 행동에 대한 특별한 지식이있는 경우에만 적용됩니다. 자기 상관은 매우 효율적으로 구현 될 수 있습니다. –

+5

와우, 뭐라구? 나는 동의하지 않는다. 주파수 영역 솔루션은 절대로 끔찍한 해결책이 아닙니다. 고조파 제품 스펙트럼 또는 셉 스트 럴 방법은 구현하기 쉽고 합리적으로 견고합니다. 자기 상관은 어떤 방법 으로든 * 일반적으로 올바른 해결책으로 간주되지 않습니다. 그것은 여러 가지 유효한 해결책 중 하나입니다. 사실, 제로 크로싱은 신뢰할 수있는 피치 표시가 아닙니다. –

+1

자기 상관은 일반적으로 FFT보다 계산 집약적입니다. 실제로 FFT를 사용하여 자기 상관을 수행합니다. 사실 더 빠릅니다. 당신이 FFT로 그것을 할 수있을 때 순진한 자기 상관을 사용하는 것은 정문을 사용하는 대신 식료품 가게의 벽을 통해 탱크를 운전하는 것과 같습니다. – endolith

19

FFT를 사용하면 빈도를 파악할 수 있지만 정확히 빈도를 알 수는 없습니다. FFT의 각 지점은 주파수의 "bin"입니다. 따라서 FFT에 피크가있는 경우 원하는 주파수가 해당 빈 또는 주파수 범위의 어딘가에 있습니다.

당신이 정말 정확합니다

, 당신은 (= 많은 메모리와 계산을 많이) 긴 높은 해상도 FFT 및 탱크를 많이해야합니다. 놀랍게도 잘 작동하는 로그 스케일 스펙트럼에서 quadratic interpolation을 사용하여 저해상도 FFT에서 실제 피크를 추측 할 수도 있습니다.

계산 비용이 가장 중요하다면, 당신은 당신이 제로 크로싱을 셀 수있는 형태로 신호를 얻기 위해 시도 할 수 있습니다, 그리고 측정 후 더 카운트, 더 정확한. 이들의

없음 그래도 fundamental is missing 경우 작동하지 않습니다. :)

내가 몇 가지 알고리즘 here을 마련했습니다, (이 만 when the fundamental is the strongest harmonic 작동하지만 - 그렇지 않으면 당신이 그것을 찾는 것에 대해 더 똑똑 할 필요) 보간 FFT는 일반적으로 가장 정확하여, 가까운 두 번째 제로 크로싱 (이것은 단지 for waveforms with one crossing per cycle에서만 작동 함). 이러한 조건 중 어느 것도 일반적이지 않습니다.

는 기본 주파수 위의 파셜 피아노 나 기타 같은 많은 악기의 하지 완벽한 고조파가 있음을 알아 두셔야합니다. 각 부분은 actually a little bit out of tune 또는 inharmonic입니다. 따라서 FFT의 고주파수 피크는 근본적인 정수 배수가 아니며 웨이브 모양이 한 사이클에서 다음 사이클로 약간 변경되어 자기 상관 관계가 사라집니다.

정말 정확한 주파수 독서를 얻으려면, 그때, 근본적인를 추측 자기 상관을 사용하여 차 보간을 사용하여 실제 피크를 찾기 위해 말하고 싶지만. (CPU주기를 절약하기 위해 주파수 영역에서 자기 상관을 수행 할 수 있습니다.) 많은 문제가 있으며 사용하는 올바른 방법은 실제로 애플리케이션에 따라 다릅니다.

은 PCM 오디오 신호의 기본 주파수의
+1

누락 된 기본 사항뿐만 아니라 현악기의 신호를 처리하는 교감 공명 문제도 있습니다. 특히 기타의 악기 튜닝 시나리오에서 특정 시간에 튜닝되지 않은 문자열은 열려 있고 튜닝 된 피치에 근접하면 연주 된 문자열과 일치하는 부분을가집니다. – marko

3

검색은 어려운 작업이며, 일반적으로 시간 기반의 방법이 있기 때문에, 화음 신호에 적합하지 않습니다, 어쨌든 그것에 대해 얘기를 많이 ...

이있을 것 다중 기본 주파수로 인한 서로 다른 고조파 성분의 합으로 주어진 복합 파는 최저 주파수 성분에만 의존하는 제로 크로싱 속도를가집니다 ... 또한 주파수 영역에서 FFT는 주파수가 가장 적합하지 않습니다 노트 사이의 간격은 선형이 아닌 지수 스케일을 따릅니다. 이것은 FFT 방법에 사용되는 일정한 주파수 분해능이 시간 영역에서 분석 창의 크기가 충분히 크지 않으면 저주파 음을 해결하기에 불충분 할 수 있음을 의미합니다.

더 적당한 방법은 DFT 다른 얻기 위해서는, 신호 (즉, 각 샘플링 주파수 스텝 반감) (2)에 의해 로우 패스 필터링 및 데시 메이션 (decimation)하는 공정 후에 도포 이는 일정한-Q 변환 될 서브 밴드들은 상이한 주파수 해상도를 갖는다. 이러한 방식으로 DFT의 계산이 최적화됩니다. 문제는 역시 시간 해상도는 변수이며, 우리는 하나의 음의 기본 주파수를 추정하려고하는 경우 낮은 서브 밴드에 대한 증가 ...

마지막으로, DFT FFT/방법 확인 있다는 것입니다. 다른 사운드의 부분이 겹치고 위상 차이에 따라 진폭을 합/취소하는 등 대위법 컨텍스트의 경우 상황이 달라 지므로 단일 스펙트럼 피크가 서로 다른 고조파 내용 (다른 음표에 속함)에 속할 수 있습니다. 이 경우에는 상관 관계가

관련 문제