FFT를 사용하여 피아노의 음표를 인식 할 수 있습니까?


13

몇 가지 음표를 인식하는 도구를 만들고 싶습니다 (바퀴를 재발 명함). 피아노에서 C, D, E 중반을 연주하고 그 음을 분류 할 수 있어야합니다. 내가 접근해야한다고 생각하는 방법은 다음과 같습니다.

  1. 음표를 연주하는 샘플을 녹음
  2. 고속 푸리에 변환을 사용하여 신호를 주파수 영역으로 변환
  3. 가장 존재하는 주파수를 찾습니다 (기본적으로 주파수 도메인 데이터의 argmax)
  4. 재생되는 음에서 주파수가 나온다고 가정하고이를 사용하여 음을 분류하십시오.

잘못된 길을 시작하고 싶지 않기 때문에 아직 시도하지 않았습니다. 이론적으로 이것이 효과가 있습니까?


제목을 더 구체적으로 지정할 수 있다면 좋을 것입니다. 피아노 피치 인식에 관한 내용을 포함 시키려고했지만 오늘날의 비영어권 언어가 실패하고 있습니다.
파이프

1
확인 @pipe 나는 그것을 변경
michaelsnowden

1
음표 연주의 "샘플"은 이미 진폭과 시간의 파형이어야합니다. 기본적으로 포인트 2는 중복됩니다. 비교적 간단한 구현을 위해서는 위의 단계만으로도 충분합니다.
user2943160

@ user2943160 명시 적으로 추가했습니다. 사운드는 다양한 형식으로 저장 될 수 있으며, 시간이 지남에 따라 좋은 진폭으로 들어가려면 약간의 조작이 필요합니다.
michaelsnowden

@michaelsnowden : "진폭"이라는 용어를 잘못 사용하고 있습니다. 사인파 함수 의 진폭 은 A 입니다. 신호의 최대 값 (전압, 변위 등)이며 일정합니다 (또는 주파수와 관련하여 천천히 변경됨). 당신이 의미하는 것은 단지 신호 y ( t ) 입니다. 그렇지 않으면 "시간이 지남에 따른 진폭"으로 생각하면 신호의 포락선을 의미하지만 이해하지 않는 한 말입니다. 와이()=(ω)와이()
Curd

답변:


23

개념은 좋지만 실제로는 그렇게 간단하지는 않습니다.

피치는 단순히 지배적 인 톤이 아니므로 문제 번호 1이 있습니다.

FFT 주파수 빈은 음악 스케일의 모든 (또는 여러) 톤을 동시에 칠 수 없습니다.

FFT 분석기와 톤 제너레이터가 포함 된 오디오 프로그램 (예 : Audacity)을 사용하여 FFT를 사용하여 특정 작업을 구현하기 전에 수행 할 수있는 작업과 수행 할 수없는 작업에 대한 느낌을 얻는 것이 좋습니다.

몇 가지 특정 톤만 감지해야하는 경우 Goertzel 알고리즘 이 더 쉽고 빠를 수 있습니다.

피치 감지는 복잡하며 해당 분야에서 여전히 연구가 진행되고 있습니다. 톤 감지는 매우 간단하지만 원하는 것을 얻지 못할 수 있습니다.


샘플이 특정 계측기 인 것으로 가정하면 문제를 다루기가 더 쉬울 수 있습니다.
mkeith

정말 좋아 보인다. 후속 질문은 Goertzel 알고리즘을 사용하여 동시에 연주되는 두 음을 감지 할 수 있습니까?
michaelsnowden

동시 톤을 감지하는 데 사용할 수 있습니다. 그것이 동시 음을 감지하기에 충분한 지 여부는 다른 질문이며, 여전히 작업 중입니다. Goertzel 기반 기타 노트 감지기를 사용하여 몇 년 동안 원숭이를 껐다 켰습니다.
JRE

2
@ mkeith : 종류. 음표를 테스트하고 특정 톤 (및 관심있는 음표)에 우세한 톤을 감지하는 것이 적합한 지 확인할 수 있습니다. 그러나 아는 한, 모든 악기에서 모든 음표를 감지하는 일반적인 해결책은 없습니다.
JRE

3

신호의 다중 모드 관찰 창을 사용하는 것이 더 좋을 것이라고 말합니다. 오디오 신호의 웨이블릿 분해 선을 따라 뭔가 음표 내부의 다중 톤을 식별 할 수 있습니다. 그래, 실제로 Wavelets, 나는 갈 길이라고 말할 것입니다.

이것은 웨이블릿이 무엇인지에 대한 매우 일반적인 분류이지만 STFT처럼 신호를 통과하는 다중 해상도 창으로 생각하십시오. 따라서 신호 내에서 다른 시간적 위치에서 발생하는 다른 정현파를 식별 할 수 있습니다. 연주하는 음이 정지 신호가 아니므로 시간이 지남에 따라 연주 및 소멸되기 때문에이 또한 중요합니다. 나는 뮤지션은 아니지만, 음의 지배력이 음표가 부패하는 동안 변한다고 생각합니다.

물론 웨이블릿 분해 후에는 음과 주변 음을 식별하는 알고리즘을 구현해야합니다.

웨이블릿은 사람들이 피치 식별 측면에서 ybout을 말하고있는 문제를 해결한다고 생각합니다.

웨이블릿 작동 방식을 배우려면 HP에서 발표 한 훌륭한 백서입니다. : http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf Wavelets 소개

구현을 위해 MATLAB에는 웨이블릿 도구가 있으며 R과 같은 플랫폼에 사용할 수있는 다른 패키지가 많이 있다고 확신합니다.


1

피아노 범위의 중간 (200 ~ 500Hz 사이)에서 연주되는 음을 생각하고 있다고 생각하지만 그 범위에서도 단일 음표 에는 기본 주파수의 정확한 배수 가 아닌 많은 톤이 있습니다. 각 음의 시작 부분과 끝 부분에서 상당한 양의 광대역 잡음.

음표 범위의 하단에있는 큰 음의 경우, 음의 에너지 (1 % 미만)가 실제로 음의 기본 피치에 거의 없음을 알 수 있습니다.

또 다른 문제는 FFT에 대한 순진한 해석이 감지하려는 신호의 진폭이 일정하다고 가정한다는 것입니다. 진폭이 실제로 여러 개의 중첩 지수 감쇠를 따르는 피아노 음표에는 적용되지 않습니다. 감쇠의 초기 부분은 비교적 짧은 시간 상수를 갖지만, 후자는 긴 시간 상수를 갖습니다.

가버 변환 또는 웨이블릿 기반 방법과 같은 단시간 스케일 푸리에 변환 방법을 더 잘 조사 할 수 있습니다.

연속 음표의 기본 피치가 각 음표에 대해 약 6 % 증가하기 때문에 오디오의 고조파 주파수를 식별하는 데 반드시 높은 정확도가 필요하지는 않습니다. 음표를 정확하게 식별하는 것은 음이 음계와 정확히 일치하는지 확인하는 것과 같은 문제가 아닙니다. 주파수가 0.1 % 이상의 정확도로 측정되어야 할 수도 있습니다.


0

예, 이것이 FFT의 전부입니다! 공급하는 데이터의 주파수 스펙트럼을 제공합니다. 어려운 부분은 앞에서 언급했듯이 구현 세부 사항입니다.

수행하려는 작업에 따라 정확하게 답변이 변경됩니다.

자신의 음악을 분석하고 싶다면 이미 소프트웨어가 있습니다. 응답을 보여주는 EQ (기본적으로 FFT)를 보거나 피치를 보여주는 "뮤직 EQ"를 얻을 수도 있습니다. 연주하는 내용을 올바른 미디 음표로 변환하는 오디오를 미디 VST로 가져올 수 있습니다. 키보드가 미디라면 VST를 건너 뛰고 미디를 직접 녹음하십시오.

FFT와 음악과의 관계를 가르치고 싶다면 Matlab과 같은 데이터를 사용하여 데이터의 FFT를 계산하는 것이 좋습니다. 그것은 wav 파일을 읽는 등의 기록 및 재생 기능이 있습니다. 이것들은 사용하기가 정말 쉽습니다. 구문을 알고 있으면 오디오를 그래프로 작성하고 모든 종류의 분석을 신속하게 수행 할 수 있습니다.

이러한 작업을 수행하기 위해 장치를 구축하려면 상당히 복잡합니다. 계산을 수행하려면 uC / dsp / fpga / etc가 필요합니다. 대부분의 인기있는 장치에는 이미 FFT 코드가 제공되므로 직접 코딩 할 필요가 없습니다 (또한 복잡합니다).

회로와 그 모든 것을 만들어야합니다. 어렵지는 않지만 경험 / 지식에 따라 시간이 오래 걸리고 학습 곡선이 가파 릅니다. 또한 최종 제품의 품질에 따라 다릅니다.

수학적으로 이상적인 음표는 기하학적 인 일련의 "기본"으로 구성됩니다.

F0이 기본 주파수라고 가정하면 대부분의 음표는 F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 + 로 근사됩니다 . ...

a_k는 고주파수 F_k의 강도 일 뿐이고 F_k는 F0의 배수 일뿐입니다. 모든 k에 대해 a_k = 0이면 순수한 정현파입니다. 이것의 피치는 감지하기 쉽습니다. FFT의 최대 값을 찾으십시오. 주파수는 톤의 기본 요소 인 음표입니다.

FFT를 받으면 데이터로 끝나고 수학을 수행합니다. 기본적으로 미적분학입니다.

비교적 쉬운 일입니다.

처리해야 할 몇 가지 문제가 있습니다. 이들 모두가 "해결"된 것은 아닙니다.

  1. 대기 시간-모든 종류의 실시간 작업을 수행하려는 경우 문제가 될 수 있습니다.

  2. 여러 음표-모든 추가 고조파로 인해 음표 그룹을 결정하기가 어렵습니다. A = 440hz와 A '= 880hz를 연주하면 대부분의 고조파가 겹칩니다. A = 440hz를 쉽게 얻을 수 있지만 A '= 880hz를 얻는 것이 더 어렵습니다. 화음, 빠른 달리기 등을 생각할 때 모든 정보 (음표)를 정확하게 얻는 것이 매우 어려울 수 있습니다. 모든 것이 일반적으로 수학적으로 가능하지만 데이터 자체에는 오류와 수차가 있으며 경우에 따라 방정식이 정의되지 않습니다.

  3. 노이즈-신호의 노이즈가 의심스러운 결과를 줄 수 있습니다. 음악 노이즈가 발생하면 결과가 나빠질 수 있습니다. 그러면 더 좋은 알고리즘이 필요할 것입니다 = 시간 + 돈 + 지식.

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