我用Python编写了有关短时傅立叶变换的代码,运行它时出现以下错误:
24 mX1 = np.zeros(N)
25 pX1 = np.zeros(N)
---> 26 mX1[:hN] = mX[hN:]
27 mX1[N-hN:] = mX[:hN]
28 pX1[:hN] = pX[hN:]
TypeError: slice indices must be integers or None or have an __index__ method
我通过整数路径解决了这个问题,但是问题还在继续:
~/Programmation/SMS/windows.py in <module>
24 mX1 = np.zeros(N)
25 pX1 = np.zeros(N)
---> 26 mX1[:hN] = mX[hN:]
27 mX1[N-hN:] = mX[:hN]
28 pX1[:hN] = pX[hN:]
ValueError: could not broadcast input array from shape (255) into shape (257)
我研究了如何使用
来实现__index__方法def __index__(self):
return obj
但没有找到方法。
第一段将导入所需的软件包。
import numpy as np
from scipy.signal import get_window
from scipy.fftpack import fft
import math
import matplotlib.pyplot as plot
第二个定义窗口的长度和类型,并保留信息的中间(hM1-hM2)。
M = 63
window = get_window('hanning', M)
hM1 = int(math.floor((M+1)/2))
hM2 = int (math.floor(M/2))
第三个使用缓冲区计算快速傅立叶变换,然后将窗口放置在0个样本的周围(下半部分开始-上半部分结束)。
N = 512
hN = N/2+1
fftbuffer = np.zeros(N)
fftbuffer[:hM1] = window[hM2:]
fftbuffer[N-hM2:] = window[:hM2]
第四部分将缓冲区的频谱计算为绝对值(不包括零),以dB和相位为单位。
X = fft(fftbuffer)
absX = abs(X)
absX[absX<np.finfo(float).eps] = np.finfo(float).eps
mX = 20*np.log10(absX)
pX = np.angle(X)
然后为了更好地查看光谱,最后一段取消了加窗。
mX1 = np.zeros(N)
pX1 = np.zeros(N)
mX1[:hN] = mX[hN:]
mX1[N-hN:] = mX[:hN]
pX1[:hN] = pX[hN:]
pX1[N-hN:] = pX[:hN]