FFT Spectrums를 사용하여 유사한 음악 찾기


16

몇 주 동안 다른 장르의 음악을 포함하는 라이브러리에서 비슷한 노래를 일치 / 찾기하는 방법을 찾기 위해 실험했습니다.

첫 번째 시도는 그룹을 형성하기 위해 템포와 같은 기능을 감지하거나 곡에 저음이 얼마나 많은지를 감지하는 것이었지만 송 비트의 약 20 %가 계산되지 않기 때문에이 방법 (볼륨 변경 기반 비트 감지)으로 멀리 가지 못했습니다. 항상 그들 중 1/2 또는 1/3이 항상 구현할 수 없었습니다.

몇 주 동안 실패한 후에이 포스트의 뒷부분에서 설명하는 새로운 아이디어를 얻었습니다. 간단히 파일의 스펙트럼 샘플을 가져 와서 "평균 스펙트럼 파일"과 같은 것을 만들어 비교하면됩니다. 예를 들어 Hardstyle은 평균 록 음악보다 훨씬 더 많은 저음을 가지고 있다는 것이 아이디어였습니다. 나는 또한 Audacity의 일부 Spectrums를 보면서 이것을 확인했습니다.

  • 파일 1 : 전체 파일 FFT 스펙트럼 가져 오기 (2048 샘플 크기 atm, 진폭 로그 스케일)
  • 모든 스펙트럼 배열을 합산하고 각 빈의 평균을 취합니다.
  • 다른 파일과 동일하게 모든 결과 저장
  • 파일 1과 다른 파일 간의 FFT 값 목록 차이점
  • 파일 1과 파일 X 사이의 평균 차이 만들기
  • 이 평균을 기준으로 오름차순 정렬
  • "차이 값"이 가장 낮은 곡은 비슷한 것으로 간주됩니다.

좋은 지식을 가진 일부 사람들이 이것이 내 아이디어를 구현하는 올바른 방법인지 말해 줄 수 있습니까?


1
템포를 감지하려는 경우 신호를 제곱 한 다음 푸리에 변환을 시도 할 수 있습니다. 1Hz 정도의 주파수는 필터링되어 일반 (제곱되지 않은) FFT 스펙트럼에 존재하지 않습니다. 피치 감지에 사용되는 관련 아이디어를 "두뇌"라고합니다. 인터넷 검색을 통해 찾을 수 있습니다. 팝과 재즈를 클래식과 구별하기 위해 드럼 키트의 소리를 감지 해보십시오. Vibrato는 기계 감지 가능해야합니다. 기계로 계산할 수있는 불협화음이 있습니다.

1
어쩌면 당신은 dsp.SE이 이동하는 중재자를 요청해야
딜립 사와 트는

질문을 SE의 DSP로 옮길 것을 요청했습니다. Drumkit Present가 있는지 또는 입력을 분류하지 않아야하는지 감지 할 수 있습니까? 제곱 신호가 어떻게 템포로 연결되는지 설명 할 수 있습니까?

3
특히 요즘 스펙트럼 확산을 극대화하는 방식으로 음악이 녹음되고 마스터됩니다. 전장 스펙트럼이 음악 분류에 대한 좋은 기준을 줄 것이라고 생각하지 않습니다.
Phonon

2
스펙트럼 대신 스펙트로 그램을보고 있어야합니다. 스펙트럼은 전체 노래의 주파수 내용을 한 번에 표시합니다. 스펙트로 그램은 시간이 지남에 따라 주파수 내용이 어떻게 변하는 지 보여줍니다.
endolith

답변:


17

당신이하려고하는 것은 수백 명의 연구자들에 의해 반복적으로 시도되어 왔으며 이것에 대해 상당히 많은 연구가 진행되고 있습니다. ISMIR 회의 진행 상황을 확인하십시오. 최신이 아니더라도 Elias Pampalk의 논문을 읽으십시오 : http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

올바른 방향으로 빠르게 방향을 설정하려면 :

음악은 여러 차원에 따라 비슷할 수 있습니다. a) 음색 / 텍스처 / 장르; b) 리듬 패턴; c) 멜로디 / 코드 진행 ... 그리고 더! 당신의 메시지에서 당신이 무엇을 측정하고 싶은지 명확하지 않습니다!

  • 당신이에 관심이 있다면 a) 당신이보고 싶은 기능은 MFCC (Mel Frequency Cepstrum Coefficients)입니다. 치수가 낮기 때문에 (13 계수 대 2048).
  • b)에 관심이 있다면, "Fluctuation Patterns"(Palpalk, 몇 개의 대역에서 0.1 .. 10 Hz 범위의 신호의 짧은 자기 상관) 기능을보십시오. 또는 Whitman의 "페니"기능 (시간 축을 따라 MFCC의 FFT).
  • c)에 관심이 있다면 크로마토 그램을보십시오. Ellis의 크로마토 그램 코드 (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/)로 시작한 다음 더 강력한 무언가가 필요한 경우 Mauch의 구현으로 이동하십시오 (http://isophonics.net/nnls-chroma ).

그것은 기능입니다. 이제 노래가 해당 기능의 시퀀스로 표시되면 노래를 비교하는 더 좋은 방법을 생각해야합니다. 시퀀스 간의 쌍별 차이를 계산하는 것은 그리 영리하지 않습니다. 예를 들어, 노래와 동일한 노래 오프셋을 약간의 침묵으로 비교하면 정확히 동일한 동안 차이가 나옵니다! 오히려 이러한 기능의 분포를 비교하고 싶습니다. 예를 들어, 노래 A에 대한 특징의 평균 / 표준 편차와 노래 B에 대한 특징의 평균 / 표준 편차를 계산 한 다음 확률 적 거리 (KL, Bhattacharyya)를 취합니다.

마지막 요점은 나중에 중요합니다. 가장 가까운 성냥을 찾기 위해 노래와 말뭉치 사이의 거리를 계산하는 것은 매우 비효율적입니다. 대규모 컬렉션을 처리 할 때 LSH 또는 Ball tree와 같은 기술을 사용하면 전체 코퍼스와 명시 적으로 비교하지 않고도 가장 가까운 이웃 쿼리를 수행 할 수 있습니다.

옆으로, 템포 감지는 완전히 다른 문제입니다. 자세히 살펴 보려면 주제에 대한 최고의 성능 / 접근성 문서는 동적 프로그래밍에 의한 Ellis의 비트 추적입니다. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . 매우 간단하지만 최신 알고리즘에 가깝습니다.


자세한 답변에 감사드립니다.이 맥락에서 이미 MFCC에 대해 여러 번 들었고 베어 FFT 결과를 사용하지 않는 것이 합리적입니다. 현재의 "지식 상태"및 개발 환경 (C #, Bass Library의 FFT 결과)으로 구현하는 것은 꽤 복잡해 보이지만 시도해 보겠습니다.
gfg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.