Найти - Пользователи
Полная версия: Определение первого бита (beat) в аудиофайле
Начало » Центр помощи » Определение первого бита (beat) в аудиофайле
1
carlos0n
Привет!
Стоит задача определить время первого бита в песне, имеется ввиду beat, а не bit конечно))
По этой задаче я нашел прикрепленный файл.
Там есть код, который по идее должен найти пики, я думал применить фильтр низких частот к песне (примеры так же есть в статье) и применить к результату те методы для поиска пиков, но пока я не могу затавить работать даже тот код из статьи.

import simpl
import matplotlib.pyplot as plt
from scipy.io.wavfile import read
# read audio samples
audio = read("/home/user/Documents/first_beat/70.wav")[1]
# take just the first few frames
audio = audio[0:4096]
# Peak detection with SndObj
pd = simpl.SndObjPeakDetection()
pd.max_peaks = 20
pks = pd.find_peaks(audio)
# Partial Tracking with
# the McAulay-Quatieri algorithm
pt = simpl.MQPartialTracking()
pt.max_partials = 20
partls = pt.find_partials(pks)
# plot the detected partials
simpl.plot.plot_partials(partls)
# set title and label axes
plt.title("Flute Partials")
plt.ylabel("Frequency (Hz)")
plt.xlabel("Frame Number")
plt.show()

вылазит ошибка

>>> pks = pd.find_peaks(audio)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “peak_detection.pyx”, line 78, in simpl.peak_detection.PeakDetection.find_peaks (simpl/peak_detection.cpp:2419)
ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

Подскажите, как поправить ошибку. В обработке сигналов я не силен, просто встала задача написать код с таким функционалом.
Буду крайне признателен за любую помощь в этом вопросе.
Возможно кто-то знает как решить эту задачу или уже решал.
carlos0n
Так же при попытке применить фильтр нижних частот по примеру из статьи

from sndobj import \
SndObj, SndRTIO, SND_OUTPUT
import scipy as sp
from scipy.signal import firwin
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
input_data = read("/home/user/Documents/first_beat/70.wav")
audio = input_data[1]
order = 101
cutoff = 0.02
filter = firwin(order, cutoff)
audio = sp.convolve(audio,filter,"same")
plt.plot(audio[0:1024])
plt.ylabel("Amplitude")
plt.xlabel("Time (samples)")
plt.title("Flute Sample")
plt.show()

полуем ошибку

>>> audio = sp.convolve(audio,filter,“same”)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “/usr/lib/python2.7/dist-packages/numpy/core/numeric.py”, line 738, in convolve
return multiarray.correlate(a, v, mode)
ValueError: object too deep for desired array

помогите поправить, а то внятного решения я найти не могу, а времени крайне мало
reclosedev
Попробуйте файл с одним каналом (моно).
carlos0n
reclosedev
Попробуйте файл с одним каналом (моно).

спасибо, действительно та ошибка пропала, но теперь возникла другая)

>>> pks = pd.find_peaks(audio)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “peak_detection.pyx”, line 78, in simpl.peak_detection.PeakDetection.find_peaks (simpl/peak_detection.cpp:2419)
ValueError: Buffer dtype mismatch, expected ‘dtype_t’ but got ‘short’

гугл ничего внятного на этот счет не говорит
carlos0n
над было использовать simpl.read_wav

import simpl
import matplotlib.pyplot as plt
from scipy.io.wavfile import read
import scipy as sp
from scipy.signal import firwin
# read audio samples
audio = simpl.read_wav("/home/user/Documents/first_beat/70.wav")[0]
# take just the first few frames
print audio.size
audio = audio[0:(4096*8)]
# low pass filter
order = 101
cutoff = 0.02
filter = firwin(order, cutoff)
audio = sp.convolve(audio,filter,"same")
# Peak detection with SndObj
pd = simpl.SndObjPeakDetection()
pd.max_peaks = 50
pks = pd.find_peaks(audio)
# Partial Tracking with
# the McAulay-Quatieri algorithm
pt = simpl.MQPartialTracking()
pt.max_partials = 100
partls = pt.find_partials(pks)
# plot the detected partials
simpl.plot.plot_partials(partls)
# set title and label axes
plt.title("Flute Partials")
plt.ylabel("Frequency (Hz)")
plt.xlabel("Frame Number")
plt.show()

код заработал, пики рисует
может кто-то подсказать, как можно теперь найти первый бит?
почему-то на первом фрейме очень много пиков на куче частот, чем это вызвано непонятно, но в общем-то первый фрейм можно не рассмотривать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB