2017-05-12 1 views
0

모노 포닉 기타 오디오 신호를 필사하기 위해 Librosa을 사용하고 있습니다.피치를 감지하기 위해 오디오 신호 조각 내기

나는 올바른 시간에 음의 변화를 감지하기 위해 발병 시간에 따라 신호를 "슬라이스 (slice)"하는 것이 좋을 것이라고 생각했다.

Librosa는 발병 시간 이전에 로컬 최소값을 탐지하는 function을 제공합니다. 나는 그 타이밍을 점검했고 그들은 정확했다.

다음은 원래 신호의 파형과 최소 시간입니다. 재생

[ 266240 552960 840704 1161728 1427968 1735680 1994752] 

waveform

멜로디 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 반환 좀 더 "정상"값 반면 비슷한 값뿐만 아니라 어떤 임의의 값 :

wholespectrogram

이 전체 신호의 스펙트로 그램이다

242.748000585 
10650.0394232 
275.25299319 
145.552578747 
154.725859019 
7828.70876515 
174.180627765 
183.731497068 

그리고 이것은 예를 들어 슬라이스 1의 스펙트로 그램입니다 (E4 참고) : spectrograme4

보시다시피 슬라이스가 올바르게 수행되었습니다. 그러나 몇 가지 문제가 있습니다. 첫째, 스펙트로 그램에 옥타브 문제가 있습니다. 나는 그 문제를 일부 예상했다. 그러나 위에서 언급 한 3 가지 방법으로 얻은 결과는 매우 이상합니다.

내 신호 처리 이해 또는 코드에 문제가 있습니까?

답변

3

내 신호 처리에 대한 이해 또는 제 코드에 문제가 있습니까?

코드가 괜찮습니다.

탐지하려는 주파수는 피치의 기본 주파수입니다 (문제는 "f0 추정"이라고도 함).

freq_from_fft과 같은 것을 사용하기 전에 신호를 필터링하여 신호를 필터링하여 가비지 과도 신호와 저주파 노이즈를 없애야합니다. 즉, 신호에 포함 된 신호이지만 문제는 아닙니다.

E2 (82 Hz)에서 F6 (1,397 Hz)까지의 어쿠스틱 기타의 경우 기본 주파수가 어느 범위에 있는지 생각해보십시오. 즉, ~ 80 Hz 이하에서 1,400 Hz 이상까지 제거 할 수 있습니다 (밴드 패스 예제의 경우 here 참조). 필터링 한 후 피치를 찾기 위해 피크 검출을 수행합니다 (기본이 실제로 가장 많은 에너지를 가졌다 고 가정).

또 다른 전략은 각 슬라이스의 첫 번째 X 샘플을 무시하는 것입니다.이 슬라이더는 충격적이고 자연스러운 고조파가 아니기 때문에 많은 정보를 제공하지는 않습니다. 따라서 조각의 마지막 90 %를보십시오.

모든 것이 f0 또는 기본 주파수 추정을위한 많은 연구가 있다는 것입니다. 좋은 시작 지점은 ISMIR입니다.

마지막으로, Librosa의 piptrack 기능은 원하는대로 할 수 있습니다.

관련 문제