피치 감지 개선을위한 팁


21

사용자가 기타를 튜닝 할 수있는 간단한 웹 앱을 만들고 있습니다. 저는 신호 처리 분야의 초보자이므로 질문이 부적절하다고 판단하지 마십시오.

그래서 FFT 알고리즘을 사용하여 기본 주파수를 얻었습니다.이 시점에서 응용 프로그램은 어떻게 작동합니다. 그러나 개선의 여지가 있습니다. 지금은 원시 pcm을 FFT 알고리즘으로 보내지 만 탐지를 향상시킬 수있는 사전 / 사후 알고리즘 / 필터가 있다고 생각했습니다. 당신은 어떤 제안 할 수 있습니까?

내 주요 문제는 특정 주파수를 감지하면 1-2 초 동안 해당 주파수를 표시 한 다음 다른 임의의 주파수로 이동하여 사운드가 연속적 인 경우에도 다시 돌아 오는 것입니다.

또한 그러한 경험이 있다면 다른 유형의 최적화에 관심이 있습니다.

답변:


20

나는 그것이 얻는 다른 주파수가 기본의 고조파라고 추측하고 있습니까? 100Hz를 재생하는 대신 200Hz 또는 300Hz를 대신 선택합니까? 먼저, 기타가있을 수있는 주파수로 검색 공간을 제한해야합니다. 당신이 필요로 하는 가장 높은 기초를 찾고 그것에 제한하십시오.

기본이 고조파보다 진폭이 낮 으면 (또는 완전히 누락되었지만 기타에는 문제가되지 않는 경우) 기본을 찾는 데 FFT보다 자동 상관 이 더 효과적입니다 .

여기에 이미지 설명을 입력하십시오

기본을 강조하고 고조파를 최소화하기 위해 더 낮은 주파수에 가중치를 부여하거나 이와 같은 피크 선택 알고리즘을 사용할 수도 있습니다 을 사용한 다음 가장 낮은 주파수를 선택할 수도 있습니다.

또한 FFT를 적용하기 전에 신호를 윈도 잉해야합니다. 창 함수로 곱하면됩니다주파수 더 깨끗하게하기 위해 파형의 시작과 끝을 테이퍼 을 사용하면됩니다. 그런 다음 넓은 주파수 구성 요소 대신 주파수 구성 요소에 대해 키가 좁은 좁은 스파이크를 얻습니다.

보다 정확한 피크를 얻기 위해 보간법을 사용할 수도 있습니다. 스펙트럼의 로그를 취한 후 포물선을 피크와 인접한 두 점에 맞추고 포물선의 실제 피크를 찾으십시오. 하지만이 정도의 정확성이 필요하지 않을 수도 있습니다.

이 모든 것에 대한 예제 Python 코드 는 다음 과 같습니다 .


이것은 내가 찾던 것입니다. 아주 좋은 대답입니다. 감사합니다!
Valentin Radu

2
테이퍼 된 창 함수를 곱하면 실제로 신호의 스펙트럼 선이 번져서 더 넓어집니다. 그러나이를 구매할 수있는 것은 다이나믹 레인지 (dynamic range)로, 예를 들어 고전력 간섭 톤이 존재하는 경우 매우 저전력 스펙트럼 라인을 식별 할 수 있습니다.
Jason R

@JasonR은 이것이 고전력 간섭 톤의 확률이 실제로 낮은 환경에서 작동하도록 설계되었다는 사실을 감안할 때 Hamming 윈도우를 사용하지 않는 것이 좋습니다.
Valentin Radu

1
해밍 창을 사용하면 측정 값을 안정적으로 유지하려는 목표에 더 가까워 졌음을 확인할 수 있습니다. 지금은 A4를 재생할 때 대부분 440Hz를 얻지 만 아주 드물게 650Hz 정도의 값을 읽습니다. 나는 그것들이 고조파라고 추측하고 있습니까? 또한, 더 높은 주파수의 경우 앱이 완벽하게 작동하고 더 낮은 주파수의 경우 실패하기 시작한다는 것을 알 수 없었습니다. 아마도 FTT를 사용하여 피크 크기 주파수 빈을 감지하고 주파수가 낮은 경우 항상 기본이 아닌 이유는 무엇입니까?
Valentin Radu

1
@mindnoise : 660Hz는 440Hz의 고조파가 아니지만 220Hz의 고조파 또는 440 이상의 완벽한 5 분의 1입니다. 또 다른 현이 공명하거나 왜곡 될 수 있습니까? FFT를 플로팅하고 살펴보면 이와 같은 문제를 파악하는 것이 훨씬 쉽습니다. 그렇습니다. 저주파수는 기계적 효과 또는 아날로그 회로에 의해 더 높은 주파수에 비해 필터링 및 감소 될 수 있습니다.
endolith

12

피치는 FFT의 피크 크기 주파수 빈과 다릅니다. 피치는 인간의 심리 음향 현상입니다. 피치 사운드는 기본적으로 누락되었거나 매우 약한 기본 요소 (일부 음색, 피아노 및 기타 사운드에서 일반적 임) 및 / 또는 피치 주파수를 압도하는 스펙트럼의 강력한 톤이 많을 수 있습니다 (그러나 여전히 사람이 피치 음으로 들립니다) . 따라서 모든 FFT 피크 주파수 검출기 (일부 윈도우와 보간 포함)는 강력한 피치 추정 방법이 아닙니다.

stackoverflow 질문 에는 더 나은 결과를 얻을 수있는 피치를 추정하는 몇 가지 대체 방법 목록이 포함되어 있습니다.

추가 : 기타 사운드를 위해이 작업을 수행하는 경우 가장 낮은 기타 줄은 실제로 약간 비 조화적인 오버톤을 생성 할 수 있으므로 사람의 귀는 서브 톤의 하위 톤과 더 밀접한 관련이있는 피치 주파수를들을 수 있으므로 피치 추정이 더욱 어려워집니다. 스트링의 실제 기본 진동 주파수가 아니라.

ADDED # 2 :이 주제에 대해 더 긴 블로그 게시물을 작성하기 위해 자주 요청되는 내용 : http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


방금 언급 한 블로그를 방문하여 댓글을 달았습니다.
robert bristow-johnson 2012

5

MP3 녹음에서 기타 솔로의 음표를 감지하는 것과 같이, 다년생 음악에서 피치 감지를 연구하는 데 수년을 보냈습니다. 또한 프로세스에 대한 간단한 설명을 제공하는 Wikipedia 섹션을 작성했습니다 (아래 링크의 "피치 감지"하위 섹션 참조).

하나의 키가 피아노를 눌렀을 때, 우리가 듣는 것은 하나의 진동 주파수가 아니라 복합음 수학적으로 관련된 다른 주파수에서 발생하는 다중 진동 진동 입니다. 서로 다른 주파수에서이 진동 복합 요소를 고조파 또는 부분이라고합니다. 예를 들어, 피아노에서 Middle C 키를 누르면 컴포지트 고조파의 개별 주파수가 기본 주파수로 261.6Hz에서 시작하고 523Hz는 2 차 고조파, 785Hz는 3 차 고조파, 1046Hz는 후기 고조파는 기본 주파수 261.6Hz의 정수 배입니다 (예 : 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1046).

수정 된 DFT Logarithmic Transform을 사용하여 피크 레벨의 주파수를 찾아 가능한 고조파를 먼저 감지합니다 (아래 다이어그램 참조). 수정 된 Log DFT에 대한 데이터를 수집하는 방식 때문에 신호에 윈도우 기능을 적용하거나 추가 및 겹치지 않아도 됩니다 . 그리고 기타, 색소폰 등의 음표로 고조파가 생성되는 주파수와 직접 정렬되도록 주파수 채널을 대수적으로 배치하도록 DFT를 만들었습니다.

이제 은퇴하면서 PitchScope Player 라는 무료 데모 앱 내에서 피치 감지 엔진의 소스 코드를 공개하기로 결정했습니다 . PitchScope Player는 웹에서 사용할 수 있으며 Windows 용 실행 파일을 다운로드하여 선택한 mp3 파일에서 작동중인 알고리즘을 확인할 수 있습니다. 아래의 GitHub.com에 대한 링크는 사용자 정의 로그 DFT 변환으로 고조파를 감지하는 방법을 볼 수있는 주파수를 정의하는 올바른 정수 관계를 만족하는 부분 (고조파)을 찾는 전체 소스 코드로 연결됩니다. 피치'.

내 피치 감지 알고리즘은 실제로 2 단계 프로세스입니다. a) 먼저 스케일 피치 가 감지됩니다 ( 'ScalePitch'에는 12 가지 가능한 피치 값이 있습니다 : {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) ScalePitch가 결정되면 옥타브 는 4 개의 가능한 옥타브 -Candidate 음표에 대한 모든 고조파를 검사하여 계산됩니다. 이 알고리즘은 특정 시점에서 대위 MP3 파일 내에서 가장 지배적 인 피치 (음표)를 감지하도록 설계되었습니다. 일반적으로 악기 솔로의 음표에 해당합니다. 2 단계 피치 감지 알고리즘의 C ++ 소스 코드에 관심이있는 사용자는 GitHub.com의 SPitchCalc.cpp 파일에있는 Estimate_ScalePitch () 함수에서 시작하려고 할 수 있습니다.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

아래는 polyphonic mp3 녹음에서 기타 솔로 3 초 동안 Logarithmic DFT (내 C ++ 소프트웨어로 제작)의 이미지입니다. 솔로를 연주하면서 기타의 개별 음에 고조파가 어떻게 나타나는지 보여줍니다. 이 Logarithmic DFT에 대한 각 노트마다 여러 고조파가 수직으로 확장되는 것을 볼 수 있습니다. 각 고조파는 동일한 시간 너비를 갖기 때문입니다. 음표의 옥타브가 결정되면 기본 주파수의 빈도를 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

아래 다이어그램은 해당 음표의 스케일 피치가 결정되면 올바른 옥타브 후보 음표 (즉, 올바른 기초)를 선택하기 위해 개발 한 옥타브 감지 알고리즘을 보여줍니다. C ++에서 메소드를보고 싶은 사람들은 GitHub의 소스 코드에 포함 된 FundCandidCalcer.cpp 파일의 Calc_Best_Octave_Candidate () 함수로 이동해야합니다.

여기에 이미지 설명을 입력하십시오


제임스, DFT 피치 검출기가 기본이 없거나 약한 음을 감지합니까?
robert bristow-johnson

그렇습니다. 2 단계 피치 감지 알고리즘은 신호에 "누락 된 (또는 약한) 기본"요소가 있어도 2 단계 프로세스의 큰 장점 인 메모를 감지합니다. 기본은 옥타브 감지가 로그 DFT 다이어그램에 대한 메모에 표시되는 시간 너비에서 수행 될 때 두 번째 단계에서 결정됩니다. 이 피치 감지 기능은 다성 mp3 신호의 혼동 내에서 작동하므로 기본을 포함하여 많은 고조파가 누락 된 음을 감지합니다. 이 답변에 옥타브 감지 알고리즘을 설명하는 두 번째 다이어그램을 추가했습니다.
제임스 폴 밀라 드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.