【问题标题】:How to plot Spectrogram using STFT in python?如何在 python 中使用 STFT 绘制频谱图?
【发布时间】:2017-08-23 21:31:59
【问题描述】:

我计算了 uint8 I/Q 数据的 STFT 并将其存储在一个 numpy 矩阵中,其中每一行存储一个窗口的 STFT,如下面的 sudo 代码所示。

#k= length of window
#fs= Sampling frequency
#n= Number of STFT calculated
#matrix= Initially empty numpy array

for i in range(0,n):
  t=data[start:end,:]   #start & end calculated with each iteration
  t=t.flatten()
  t=t-127.5
  array = np.empty(t.shape[0]//2, dtype=np.complex128)
  array.real = t[::2]
  array.imag = t[1::2]

  transform=(np.fft.fft(temp_array))
  line = 2*abs(transform)/k

  #Inserting row into numpy array
  if(i==0):
     matrix = np.hstack((matrix, line))
  else:
     matrix = np.vstack((matrix, line))

现在如何绘制频率与时间的频谱图?

【问题讨论】:

  • 你研究过matplotlib吗?
  • 是的,我在 matplotlib 和 scipy 中都做过,但在复杂的 numpy 数组中都不能正常工作
  • 为什么是复杂数组?取 FFT 的绝对值应该得到可以用 matplotlib 的imshow 轻松绘制的实际值。请注意不要使用复杂数据类型初始化matrix
  • @kazemakase 您的意思是在采用绝对值后使用带有范围的 imshow,即 ax.imshow(np.absolute(matrix),extent=[0,100,0,1]) ?我假设频率将在 Y 轴上。
  • @JayKrishna 是的,这应该可以按预期工作。仍然......看起来你只将绝对值放入line,因此无论如何都放入matrix,所以令人惊讶的是你在matrix中有复数。

标签: python-3.x numpy signal-processing spectrogram


【解决方案1】:

你能做的就是用这个

第一种方法:

import scipy.io.wavfile as wav
import scipy.signal as signal
from matplotlib import pyplot as plt

sample_rate, samples = wav.read(filename)
f, t, Zxx = signal.stft(samples, fs=sample_rate)
plt.pcolormesh(t, f, np.abs(Zxx), cmap=cmap)

或者第二种方法:

plt.specgram(samples, cmap=cmap, Fs=sample_rate)

我发现第二个有更好的可视化效果。 不知道如何让第一个看起来和第二个一样好。

【讨论】:

  • cmap 未定义。
  • (second) cmap 必须替换为颜色图的名称。在 matplotlib.org 上的图库中有一张包含所有可用颜色图及其名称的绘图。以及如何使用它们。
  • 糟糕。图库不再出现在首页上。现在在例子中。检查这个:matplotlib.org/gallery/color/…
  • 要在第一个上实现第二个的外观,只需执行 np.abs(Zxx) 的 np.log()
【解决方案2】:
import os
import librosa
import librosa.display
import IPython.display as ipd
import numpy as np
import matplotlib.pyplot as plt

filename = '<yourfile name/ location>'
x, sr = librosa.load(filename)

import librosa.display                   #explicitly import librosa.display
X = librosa.stft(x)                      #perform short-term fourier transfrom               
Xdb = librosa.amplitude_to_db(abs(X))    #convert an amplitude spectrogram to dB-scaled spectrogram.
plt.figure(figsize=(15, 5))              #initialize the fig size
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2013-02-25
    • 2015-11-23
    • 2013-05-07
    相关资源
    最近更新 更多