首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python中的短时傅立叶变换

python中的短时傅立叶变换
EN

Stack Overflow用户
提问于 2012-02-23 01:10:55
回答 1查看 6.4K关注 0票数 5

我想得到的频率与最大功率的每一个时刻在wav文件。因此,我使用scipy中的fft用Python编写了STFT。我使用了scipy的kaiser窗口函数。一切看起来都很棒,但我的输出看起来很奇怪。它有一些非常小的数字和一些非常高的数字。

下面是一个wav文件的输出:http://pastebin.com/5Ryd2uXj,下面是python的代码:

代码语言:javascript
代码运行次数:0
运行
复制
import scipy, pylab
import wave
import struct
import sys

def stft(data, cp, do, hop):
    dos = int(do*cp)
    w = scipy.kaiser(dos,12) //12 is very high for kaiser window
    temp=[]
    wyn=[]
    for i in range(0, len(data)-dos, hop):
        temp=scipy.fft(w*data[i:i+dos])
        max=-1
        for j in range(0, len(temp),1):
            licz=temp[j].real**2+temp[j].imag**2
            if( licz>max ):
                max = licz
                maxj = j
        wyn.append(maxj)
    #wyn = scipy.array([scipy.fft(w*data[i:i+dos])
        #for i in range(0, len(data)-dos, 1)])
    return wyn

file = wave.open(sys.argv[1])
bity = file.readframes(file.getnframes())
data=struct.unpack('{n}h'.format(n=file.getnframes()), bity)
file.close()

cp=44100 #sampling frequency
do=0.05 #window size
hop = 5

wyn=stft(data,cp,do,hop)
print len(wyn)
for i in range(0, len(wyn), 1):
    print wyn[i]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-23 03:36:12

正弦波的实际傅里叶变换是一对与0频率等距离的增量函数。对于离散函数(采样),这在频域中以每个fs (采样率)重复。FFT计算中的小误差将意味着这两个增量(正弦波的FT)将不会完全相同的高度,因此您的算法只是选择更高的一个。

scipy FFT函数将给出域为[0, fs]的频率分量。因为(正如我上面提到的)这是周期性的,所以这些值也可以通过交换中心点的结果来重新映射为[-fs/2, fs/2] -请考虑使用fftshift来实现这一点。然而,听起来你可能只对正频率感兴趣,所以你可以简单地丢弃FFT结果的后半部分。

来自scipy.fftpack.fft的笔记

结果的包装是“标准”的:如果A= fft(a,n),则A包含零频项,A1:n/2+1包含正频项,An/2+1:包含负频项,按负频率递减的顺序。因此,对于8点变换,结果的频率是0,1,2,3,4,-3,-2,-1。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9399584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档