在STFT中实现_索引_方法

2024-09-27 19:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我研究了如何使用

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]

Tags: fromimportnpzerosmathwindowhnmx

热门问题