我使用matplotlib的波谱来比较吉他弦的音调特性。Magnitude_spectrum将y轴表示为具有“震级(能量)”的单位。我使用两个不同的“进程”来比较FFT。过程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

发布于 2015-05-12 14:42:05
磁只是频谱的绝对值。正如你在过程1中所说的那样,“能量”是一个思考它的好方法。
过程1和过程2都在相同的单元中。唯一的区别是进程2中的值被数组的总长度除以(一个标量,因此单位不变)。通常情况下,这是FFT的一部分,但有时它不(例如,numpy.FFT不包括除以长度)。
扩展到dB的最简单方法是:
(频谱,频率,_) =magnitude_spectrum(dB,Fs=fs,比例尺=‘dB’)
如果你想自己做这件事,那么你需要做如下的事情: spectrum2 =20*numpy.log10(光谱)
**值得注意的是,我不确定你是否应该应用/len(光谱)。我建议用刻度=‘dB’!
发布于 2015-05-11 21:40:06
若要转换为dB,请在绘制之前,获取任何非零光谱幅度的日志和标度(如果有校准的麦克风和声源,则使用刻度来匹配校准过的麦克风和声源,或者使用任意比例来使级别看起来熟悉)。
对于零幅值,也许只需将日志替换或夹紧在日志图的底部(当然不是负无穷大)。
https://stackoverflow.com/questions/30176931
复制相似问题