2012-03-08 2 views
1

저는 고속 푸리에 변환을 연구했으며 한 신호에서 여러 주파수를 디코딩 할 수있는 방법을 볼 수 없었습니다. fft 계산의 결과를 분해하여 코드에서 개별 피치를 보거나 fft의 결과에 따라 가장 적합한 코드를 계산할 수 있습니까?다중 피치 검출 : FFT 또는 다른?

그렇지 않은 경우 라이브 설정에서 여러 피치를 감지 할 수있는 또 다른 피치 감지 방법이 있습니까?

EDIT : 내가 기타를 다룰 때 사용하는 소프트웨어가 한 번에 6 개 이상의 피치를 쓰려고하지 않습니다. 프로그램 사용자가 7 현 기타를 가지고있는 경우에는 최대 7 피치를 가져올 수 있어야합니다.

그렇다면 하나의 마이크 신호에서이를 처리 할 수있는 FFT (또는 다른 방법)가 있습니까? 아니면 각 문자열을 개별적으로 읽는 기타 픽업을해야합니까?

+2

https://github.com/CreativeDetectors/PitchScope_Player

얼마나 많은 톤 또는 사인파 우리는 원래의 신호에 대해 말을하는거야? DTMF 신호의 2 코어 톤과 같은 몇 가지 경우 FFT가 작동 할 가능성이 높습니다. 봉우리를 검색하면됩니다. 그렇지 않으면 음악의 경우 일반적으로 컴퓨터 과학 및 신호 처리에서 어려운 문제로 알려져 있습니다. "자동 음악 녹음"에서 인터넷 검색을 할 수 있으며이를 시도하는 일부 소프트웨어 나 코드를 찾을 수 있습니다. – selbie

+0

복잡한 사운드를 처리 할 수있는 Melodyne이라는 유명한 소프트웨어가 있습니다. – cmannett85

+0

이 질문의 가능한 중복 : http://stackoverflow.com/questions/4337487/chord-detection-algorithms/4339225#4339225 – hotpaw2

답변

2

파라 메트릭 스펙트럼 추정을위한 두 가지 잘 알려진 통계 기법이 있습니다. 하나는 MUSIC 이고 다른 하나는 ESPRIT입니다. 가중치를 적용한 복소 지수 (즉, 사인 곡선)의 합으로 신호를 표현할 수 있다면 그 중 하나를 적용 할 수 있습니다. 또한 상관 행렬의 고유 분해 (eigendecomposition)는 신호의 주파수 수를 알려주므로이를 알지도 못합니다. ESPRIT는 MUSIC보다 낫습니다. 주파수 영역에서 피크를 검색하지 않아야하기 때문입니다. 주파수는 결과로 직접 주어집니다. 그러나 MUSIC은 더 강력합니다.

+0

이것은 내가 찾고있는 것입니다. 실제 결과를 생성하기에 충분히 빠릅니다 (예 : 기타리스트에게 실시간 피드백 제공). – Adam

+0

데이터의 크기에 따라 다릅니다. 저는 ESPRIT을 더 좋아합니다.이 경우 당신은 두 가지 고유 한 성질을 취하기로되어 있습니다. M by M 자기 상관 행렬의 경우 이것은 M^3 연산에 해당합니다. 문제는 M이 K보다 커야한다는 것입니다. K는 신호의 주파수 수입니다. 그래서 너무 많은 주파수가 없으므로 귀하의 경우에 큰 문제가 될 것이라고 생각하지 않습니다. – YBE

+1

@YBE : MUSIC과 ESPRIT는 관련된 지수의 정확한 수를 모르는 경우 성능이 떨어지는 것으로보고되고 기타는 각 문자열에 대해 수십 가지의 배음 수를 생성 할 수 있으며 그 중 일부는 잠재적으로 약간 고조파. – hotpaw2

1

각 문자열을 분리하는 기타 픽업이 필요할 수 있습니다. 그렇지 않으면 모든 배음을 언 믹싱하는 것은 매우 어려운 문제 일 수 있습니다.

1

'피치'이 실제로 무엇인지 이해해야합니다 (아래 위키 백과 링크 참조). 기타 또는 피아노에서 단일 음을 만들었을 때 소리가 들리는 진동의 한 주파수가 아니라 수학적으로 다른 여러 주파수에서 발생하는 여러 소리 진동의 합성이 있습니다. 다른 주파수에서 진동의 복합체의 요소를 고조파 또는 부분 음이라고합니다. 예를 들어 피아노의 미들 C 키를 누르면 합성 고조파의 개별 주파수는 기본 주파수로 261.6 Hz에서 시작되고 523 Hz는 제 2 고조파, 785 Hz는 제 3 고조파, 1046 Hz는 4 차 고조파 등이 될 수 있습니다. 이후의 고조파는 기본 주파수 261.6 Hz (예 : 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1046)의 정수배입니다.

다음은 GitHub.com에서 Windows에서 재생되는 동안 다성 음악 MP3 파일에서 실시간 피치 검색을 수행 할 수있는 이상한 2 단계 알고리즘의 C++ 소스 코드입니다. 이 무료 응용 프로그램 (PitchScope Player, 웹에서 사용 가능)은 MP3 녹음시 기타 또는 색소폰 솔로의 음을 감지하는 데 자주 사용됩니다. Windows 용 실행 파일을 다운로드하면 선택한 MP3 파일에서 알고리즘을 볼 수 있습니다. 이 알고리즘은 MP3 또는 WAV 음악 파일 내에서 주어진 시간에 가장 지배적 인 음조 (음표)를 감지하도록 설계되었습니다. 음표 세트는 MP3 녹음 중 주어진 순간에 가장 지배적 인 음조 (음표)의 변화로 정확하게 추론됩니다.

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

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

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

enter image description here