首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于比较吉他字符串的Python Magnitude_spectrum单元

用于比较吉他字符串的Python Magnitude_spectrum单元
EN

Stack Overflow用户
提问于 2015-05-11 20:21:12
回答 2查看 1.8K关注 0票数 1

我使用matplotlib的波谱来比较吉他弦的音调特性。Magnitude_spectrum将y轴表示为具有“震级(能量)”的单位。我使用两个不同的“进程”来比较FFT。过程2(由于缺乏更好的描述)更容易解释-代码&下面的图表

我的问题是:

  • 就单位而言,“震级(能量)”意味着什么?它与dB的关系如何?
  • 使用#Process 2(见下面的代码和图表),我看到的是哪种类型的单元,dB?
  • 如果#Process 2不是dB,那么将其扩展到dB的最佳方法是什么?

下面的代码(简化)显示了我正在谈论/查看的一个例子。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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’!

票数 2
EN

Stack Overflow用户

发布于 2015-05-11 21:40:06

若要转换为dB,请在绘制之前,获取任何非零光谱幅度的日志和标度(如果有校准的麦克风和声源,则使用刻度来匹配校准过的麦克风和声源,或者使用任意比例来使级别看起来熟悉)。

对于零幅值,也许只需将日志替换或夹紧在日志图的底部(当然不是负无穷大)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30176931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档