모노 포닉 기타 오디오 신호를 필사하기 위해 Librosa을 사용하고 있습니다.피치를 감지하기 위해 오디오 신호 조각 내기
나는 올바른 시간에 음의 변화를 감지하기 위해 발병 시간에 따라 신호를 "슬라이스 (slice)"하는 것이 좋을 것이라고 생각했다.
Librosa는 발병 시간 이전에 로컬 최소값을 탐지하는 function을 제공합니다. 나는 그 타이밍을 점검했고 그들은 정확했다.
다음은 원래 신호의 파형과 최소 시간입니다. 재생
[ 266240 552960 840704 1161728 1427968 1735680 1994752]
멜로디 E4, F4, F # 4 ... B4이다.
그러므로 결과는 이상적으로 330Hz, 350Hz, ..., 493Hz (약)이어야합니다.
여기서 알 수 있듯이 minima
배열의 시간은 노트를 연주하기 직전의 시간을 나타냅니다.
그러나 슬라이스 신호 (슬라이스 당 단 하나의 노트가있는 10-12 초)에서는 주파수 검색 방법이 실제로 좋지 않습니다. freq_from
기능 here에서 직접 촬영
y, sr = librosa.load(filename, sr=40000)
onset_frames = librosa.onset.onset_detect(y=y, sr=sr)
oenv = librosa.onset.onset_strength(y=y, sr=sr)
onset_bt = librosa.onset.onset_backtrack(onset_frames, oenv)
# Converting those times from frames to samples.
new_onset_bt = librosa.frames_to_samples(onset_bt)
slices = np.split(y, new_onset_bt[1:])
for i in range(0, len(slices)):
print freq_from_hps(slices[i], 40000)
print freq_from_autocorr(slices[i], 40000)
print freq_from_fft(slices[i], 40000)
: 내 코드에서 버그를 볼 수 없기 때문에 나는 혼란 스러워요.
이 방법으로는 정밀도가 좋지 않다고 생각 하겠지만 몇 가지 미친 결과가 나타납니다. 구체적 freq_from_hps
반품 :
1.33818658287
1.2078047577
0.802142642257
0.531096911977
0.987532329094
0.559638134414
0.953497587952
0.628980979055
이러한 값은 8 개 해당 슬라이스 8 피치로되어있다 (Hz 단위!). 10000Hz 근처
freq_from_fft
반환 freq_from_autocorr
반환 좀 더 "정상"값 반면 비슷한 값뿐만 아니라 어떤 임의의 값 :
이 전체 신호의 스펙트로 그램이다
242.748000585
10650.0394232
275.25299319
145.552578747
154.725859019
7828.70876515
174.180627765
183.731497068
그리고 이것은 예를 들어 슬라이스 1의 스펙트로 그램입니다 (E4 참고) :
보시다시피 슬라이스가 올바르게 수행되었습니다. 그러나 몇 가지 문제가 있습니다. 첫째, 스펙트로 그램에 옥타브 문제가 있습니다. 나는 그 문제를 일부 예상했다. 그러나 위에서 언급 한 3 가지 방법으로 얻은 결과는 매우 이상합니다.
내 신호 처리 이해 또는 코드에 문제가 있습니까?