Несоответствие между сегментированием аудиосигнала перед вычислением спектрограмм и сегментированием спектрограммы всего сигнала

#python #segment #librosa #spectrogram

Вопрос:

По какой-то причине я хочу сегментировать спектрограмму mel, делая это двумя способами, которые, как я ожидаю, будут идентичными. Один из способов состоит в том, чтобы сначала разбить аудиосигнал на сегменты по 1 секунде, затем рассчитать спектрограммы для каждого из них отдельно и собрать их в массив. Другой способ-рассчитать спектрограмму mel общего начального сигнала, а затем разбить ее на сегменты размером 20 (при расчете mel-спектрограммы используются окна 0,05, поэтому 20 окон соответствуют 1 секунде звука).

В обоих случаях я использую librosa.feature.melspectrogram , со следующей конфигурацией:

 x, fs = librosa.load(filename, sr=None)
WINDOW_LENGTH = (50 * 1e-3)
HOP_LENGTH = (50 * 1e-3)
n_fft = int(WINDOW_LENGTH * fs)
hop_length = int(HOP_LENGTH * fs) 
       
spectrogram = librosa.feature.melspectrogram(y=x, sr=fs, n_fft=n_fft,
                                                     hop_length=hop_length,center=False,norm=None)
spectrogram_dB = librosa.power_to_db(spectrogram,  ref=1.0)
 

Хотя метод сегментации, по-видимому, не вызывает никаких проблем в обоих случаях, конечные массивы, состоящие из mel-спектрограмм сегментов, не идентичны.

В частности, я вычисляю ошибку, принимая разницу спектрограмм для каждого из 100 сегментов в двух случаях соответственно следующим образом:

 error = [np.mean(np.abs(method_segmented_audio[:,:,i] - method_segmented_spec[:,:,i])) for i in range(100)]
 

и ошибка возникает следующим образом:

 [0.0012871933, 6.28829e-09, 2.7418137e-09, 4.8577786e-09, 4.5746567e-09, 2.026558e-09, 0.0, 0.0, 0.0, 0.0, 8.06942e-05, 0.0, 6.3575804e-08, 6.632134e-08, 8.428935e-08, 6.373413e-08, 3.695488e-09, 0.00043003858, 4.529953e-09, 1.847744e-09, 0.008975338, 0.00892515, 0.0071364134, 0.0, 0.00092992594, 0.0061012344, 0.0009657478, 0.006061785, 0.0070282617, 0.0057152417, 0.0058460925, 0.024407648, 0.032102566, 0.011600957, 0.009690223, 0.013338451, 0.0053842925, 0.009147603, 0.0064343186, 0.007549923, 0.011204256, 0.014292766, 0.094058804, 0.07289026, 0.07254979, 0.039817344, 0.031266004, 0.028668368, 0.021836547, 0.025875531, 0.033926304, 0.028298534, 0.049282826, 0.115293354, 0.16123281, 0.089589186, 0.058581293, 0.068415806, 0.077812254, 0.099112965, 0.11608478, 0.09578336, 0.0887864, 0.09481927, 0.1342587, 0.19033282, 0.15375374, 0.14322536, 0.13453734, 0.14158897, 0.17541637, 0.18169136, 0.24967115, 0.32328007, 0.15902717, 0.14188096, 0.17479458, 0.24835968, 0.30652562, 0.20262244, 0.2206578, 0.22790454, 0.33675858, 0.36224505, 0.37624457, 0.4253438, 0.24749759, 0.20309882, 0.24389352, 0.4223883, 0.34112835, 0.39577222, 0.35087958, 0.31030443, 0.41565105, 0.47484094, 0.31993523, 0.34082952, 0.4937231, 0.5253059]
 

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

Есть какие-нибудь идеи? Существует ли какая-либо другая конфигурация функции librosa.feature.melspectrogram, которую я должен принять во внимание?

Комментарии:

1. Можете ли вы привести пример аудио (или использовать некоторые из примеров, включенных в librosa), а также график ошибок?