Модули Matplotlib Magnitude_spectrum в Python для сравнения гитарных струн
Я использую matitude_spectrum от matplotlib для сравнения тональных характеристик гитарных струн. Magnitude_spectrum показывает ось y как единицу измерения "Величина (энергия)". Я использую два разных "процесса" для сравнения БПФ. Процесс 2 (из-за отсутствия лучшего описания) гораздо проще интерпретировать и кодировать ниже
Мои вопросы:
- С точки зрения единиц, что означает "Величина (энергия)" и как она связана с дБ?
- Используя #Process 2 (см. Код и графики ниже), на какой тип единиц я смотрю, дБ?
- Если #Process 2 не является дБ, то как лучше всего масштабировать его до дБ?
Мой код ниже (упрощенный) показывает пример того, о чем я говорю / смотрю.
import numpy as np
from scipy.io.wavfile import read
from pylab import plot
from pylab import plot, psd, magnitude_spectrum
import matplotlib.pyplot as plt
#Hello Signal!!!
(fs, x) = read('C:\Desktop\Spectral Work\EB_AB_1_2.wav')
#Remove silence out of beginning of signal with threshold of 1000
def indices(a, func):
#This allows to use the lambda function for equivalent of find() in matlab
return [i for (i, val) in enumerate(a) if func(val)]
#Make the signal smaller so it uses less resources
x_tiny = x[0:100000]
#threshold is 1000, 0 is calling the first index greater than 1000
thresh = indices(x_tiny, lambda y: y > 1000)[1]
# backs signal up 20 bins, so to not ignore the initial pluck sound...
thresh_start = thresh-20
#starts at threshstart ends at end of signal (-1 is just a referencing thing)
analysis_signal = x[thresh_start-1:]
#Split signal so it is 1 second long
one_sec = 1*fs
onesec = x[thresh_start-1:one_sec+thresh_start-1]
#process 1
(spectrum, freqs, _) = magnitude_spectrum(onesec, Fs=fs)
#process 2
spectrum1 = spectrum/len(spectrum)
Я не знаю, как выполнить массовую обработку нескольких WAV-файлов, поэтому я запускаю этот код отдельно для целого ряда различных WAV-файлов и помещаю их в Excel для сравнения. Но ради того, чтобы не смотреть на уродливые графики, я написал это на Python. Вот как выглядят # process1 и # process2 при отображении:
Процесс 1
Процесс 2
2 ответа
Магнит является просто абсолютной величиной частотного спектра. Как вы отметили в Процессе 1, "Энергия" - хороший способ обдумать это.
И Процесс 1, и Процесс 2 находятся в одинаковых единицах. Единственное отличие состоит в том, что значения в Процессе 2 были разделены на общую длину массива (скаляр, следовательно, без изменения единиц). Обычно это происходит как часть FFT, но иногда это не так (например, numpy.FFT не включает деление на длину).
Самый простой способ масштабировать его до дБ:
(спектр, частота, _) = величина_спектра (одна секунда, Fs=fs, масштаб ='дБ')
Если вы хотите сделать это самостоятельно, вам нужно сделать что-то вроде: spectrum2 = 20 * numpy.log10 (spectrum)
** Стоит отметить, что я не уверен, следует ли применять /len(спектр) или нет. Я бы предложил использовать шкалу ='дБ'!!
Чтобы преобразовать в дБ, возьмите журнал любых ненулевых амплитуд спектра и масштаб (масштаб, чтобы соответствовать откалиброванному микрофону и источнику звука, если он доступен, или используйте произвольную шкалу, чтобы уровни выглядели знакомо иначе), прежде чем строить график.
Для значений нулевой величины, возможно, просто замените или зажмите журнал с тем, что вы хотите быть в нижней части вашего графика (конечно, не отрицательной бесконечности).