Python幅度谱图

Posted

技术标签:

【中文标题】Python幅度谱图【英文标题】:Python amplitude spectrum plot 【发布时间】:2015-05-17 09:37:27 【问题描述】:

我有两个浮点值列表,一个用于时间,另一个用于从示波器获取的电压值(我假设)。我必须画一个幅度谱图,但我不确定我需要使用什么函数以及我需要给它什么参数,我尝试了 fft(u),但它不起作用。

感谢任何帮助,如果您需要更多信息,请告诉我。

【问题讨论】:

查看matplotlib Python 绘图库。 我在 pylab 中使用 IDLE,就包括特定库而言,我认为我很好。我不能做fft,这就是问题所在。我收到错误“模块”对象不可调用 我使用了magnitude_spectrum(insertvaluehere) 以防其他人遇到同样的问题,老实说,我不确定它是否完全正确,但它确实是。感谢 leekaiinthesky 的帮助! 这个问题之前已经回答过了:***.com/questions/24382832/… 【参考方案1】:

使用numpy

作为一个例子,让我展示一下我是如何分析立体声 WAV 文件中的频率的;

首先我读取数据并在左右通道中分离;

import wave
import numpy as np

wr = wave.open('input.wav', 'r')
sz = 44100 # Read and process 1 second at a time.
da = np.fromstring(wr.readframes(sz), dtype=np.int16)
left, right = da[0::2], da[1::2]

接下来我对其进行离散傅立叶变换;

lf, rf = abs(np.fft.rfft(left)), abs(np.fft.rfft(right))

我们用 mathplotlib 绘制左通道;

import matplotlib.pyplot as plt

plt.figure(1)
a = plt.subplot(211)
r = 2**16/2
a.set_ylim([-r, r])
a.set_xlabel('time [s]')
a.set_ylabel('sample value [-]')
x = np.arange(44100)/44100
plt.plot(x, left)
b = plt.subplot(212)
b.set_xscale('log')
b.set_xlabel('frequency [Hz]')
b.set_ylabel('|amplitude|')
plt.plot(lf)
plt.savefig('sample-graph.png')

图表看起来像这样;

【讨论】:

非常感谢,这对您很有帮助。 abs(fft.fft()) 效果很好,我只是不知道我应该使用什么:D【参考方案2】:

这是信号的频率-时间谱,存储在波形文件中

import wave
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

signal_wave = wave.open('voice.wav', 'r')
sample_frequency = 16000

data = np.fromstring(signal_wave.readframes(sample_frequency), dtype=np.int16)
sig = signal_wave.readframes(-1)

sig = np.fromstring(sig, 'Int16')

波形文件

sig = sig[:]

对于波形文件的某些片段

sig = sig[25000:32000]

绘制信号波形文件的频谱

plt.figure(1)
c = plt.subplot(211)
Pxx, freqs, bins, im = c.specgram(sig, NFFT=1024, Fs=16000, noverlap=900)
c.set_xlabel('Time')
c.set_ylabel('Frequency')
plt.show()

【讨论】:

以上是关于Python幅度谱图的主要内容,如果未能解决你的问题,请参考以下文章

python生成语谱图

Python绘制语谱图+时域波形

Python语音分析从绘制好看的波形图和语谱图开始

python ANSI艺术谱图查看器,用于从麦克风读取音频

绘制语谱图

用matlab进行傅里叶变换。傅里叶变换得到的相位谱、幅值谱有啥用?怎么分析?