在STFT中实现__index__方法

时间:2019-03-22 17:41:12

标签: python numpy

我用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]

0 个答案:

没有答案