普通网友 2015-04-29 05:46 采纳率: 66.7%
浏览 6418

python 这样获取信号的频率是可以的,但是不知道振幅和相位为什么不对啊?

 #!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@author: akon
"""
from __future__ import division
import matplotlib.pyplot as pl
import numpy as np
from scipy.signal import butter, lfilter
import wave
import struct
def band_pass(freq,sig,Fs,N):
   fft_sig = np.fft.rfft(sig,N)/N
   freqs=np.fft.fftfreq(len(fft_sig))
   nyq=0.5*Fs
   j=0
   signature=[None]*len(freq)
   for i in freq:
    print i
    low=(i-10)/nyq
    high=(i+30)/nyq
    b,a=butter(6,[low,high],btype='band')
    signature[j]=lfilter(b,a,sig)
    j=j+1
   #print(signature)

   return  signature

def freq_amp(sig,N,Fs):
    fft_sig = np.fft.rfft(sig)/len(sig)
    freqs=np.fft.fftfreq(len(fft_sig))
    amp=2*np.abs(fft_sig)

    fft_amp=np.where(amp>0.3,1,0)
    print fft_amp
    #idx = [None] * N  
    j=0
    m=0
    n=0
    q=0
    indx=[None]*len(fft_sig)
    for i in range(len(fft_sig)):###获取振幅为1的下标数组,并且唯一
        if((fft_amp[i]==1) and(fft_amp[i-1]-fft_amp[i]<0)):
                indx[j]=i
                j=j+1
    freq=[None]*j
    amplitude=[None]*j
    phase=[None]*j
    for k in range(j):###根据频谱振幅的下标获取频率,振幅              
            freq[m]=indx[k]*Fs/N
        #freq=abs(freqs[indx[k]]*framerate)
        print indx[k]
            m=m+1
            amplitude[n]=2*np.abs(fft_sig[indx[k]])
        n=n+1
        phase[q]=np.rad2deg(np.angle(fft_sig[indx[k]]))
        q=q+1
    print freq,amplitude,phase
        return freq,amplitude,phase,indx,j

#def open(path):
#    wav_file= wave.open(path, 'rb')
#    Fs = wav_file.getframerate()
#    params = wav_file.getparams()
#    nchannels, sampwidth, framerate, nframes = params[:4] 
#    data=wav_file.readframes(nframes)
#    wav_file.close()
#    data = struct.unpack('{n}h'.format(n=nframes), data)
#    data = np.array(data)
#    return Fs,data,framerate

if __name__ == '__main__':
    Fs = 6000  
    T_interval = 1/Fs  
    Freq_max = Fs/2    
    N=1024 
    t = np.arange(0,N-1)*T_interval  
    freq = np.linspace(0,Freq_max,N/2+1)    
    sig = np.sin(500*np.pi*t)+np.sin(1000*2*np.pi*t)+np.sin(2500*2*np.pi*t)  
    freq,amplitude,phase,index,number=freq_amp(sig,N,Fs)
    signature=band_pass(freq,sig,Fs,N)

  • 写回答

2条回答 默认 最新

  • oyljerry 2015-04-29 06:51
    关注

    翻书看看你的算法公式是不是对的

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境