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

问题描述

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)

解决方案

仔细调试下,看看每一步计算和你书上的公式是否一致

解决方案二:

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

时间: 2024-11-02 15:45:49

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

初步理解Python进程的信号通讯_python

信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT     终止进程  中断进程  (control+c) SIGTERM   终止进程     软件终止信号 SIGKILL   终止进程     杀死进程 SIGALRM 闹钟信号进程结束信号 SIGTERM和SIGKILL的区别 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序.在关闭程序之前,您可以结束

软件和网页互动-如何用python实现获取操作网页的信息?

问题描述 如何用python实现获取操作网页的信息? 例如用python做了一个html文件(路径在本地),用浏览器打开后,可以在这个页面点击某个链接或者选取某段文字,那么这些动作信息(例如点击了哪个链接或者选择了哪段文字)怎样用python编程获取到呢? 谢谢!!

Python简单获取自身外网IP的方法_python

本文实例讲述了Python简单获取自身外网IP的方法.分享给大家供大家参考,具体如下: #encoding=utf-8 #author: walker #date: 2016-03-07 #function: 获取自己的外网IP import requests from bs4 import BeautifulSoup #获取外网IP def GetOuterIP(): url = r'http://www.whereismyip.com/' r = requests.get(url) bTag

python简单获取本机计算机名和IP地址的方法

  本文实例讲述了python简单获取本机计算机名和IP地址的方法.分享给大家供大家参考.具体实现方法如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 >>> import socket >>> hostname = socket.gethostname() >>> print hostname china-43226208c >>>ip = socket.gethostbyname(hostname) >>

python实现获取客户机上指定文件并传输到服务器的方法_python

本文实例讲述了python实现获取客户机上指定文件并传输到服务器的方法.分享给大家供大家参考.具体分析如下: 该程序实现了,把目标机器的某个目录(可控)的所有的某种类型文件(可控)全部获取并传到己方的机器上. 1.用了base64的encode(infile,outfile)加密,以及decode(infile,outfile)解密,这是2进制加密解密 2.用zip压缩 3.socket中server.py放到自己这方python server.py,然后client.py放到目标机器,然后py

串口api-QT串口编程,如何获取电脑当前可用端口名。

问题描述 QT串口编程,如何获取电脑当前可用端口名. 在QT串口编程中,我使用的是第三方类qextserialport,里面好像没有获取端口名的函数,我想把可用的端口名放在下拉框里,手动设置不合理啊.求指导. 解决方案 调用windows API,查询注册表获取当前可用的端口,已解决.

操作-请问下 python 如何获取当前剪切板的内容?

问题描述 请问下 python 如何获取当前剪切板的内容? 网站需要cookie 而且有登陆时候很多东西很麻烦,所以不太好用urllib 我现在可以操作复制内容,该如何获取剪切板的内容?谢谢了 解决方案 用pywin的clipboardhttp://blog.log4d.com/2010/10/python-clipboard/ 解决方案二: 安装pyperclip 包 pip install pyperclip 当然前提是你在你的电脑上可以使用pip安装 示例代码 import pypercl

win-【Win32编程】如何获取带ES_PASSWORD属性的编辑框内的文本

问题描述 [Win32编程]如何获取带ES_PASSWORD属性的编辑框内的文本 求大神!!! 已获取到其他软件编辑框的句柄,如何获取那个编辑框内的文本(编辑框有PASSWORD属性)??? 我使用SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)szText);可以获取没有PASSWORD属性的编辑框内的文本,获取不了带ES_PASSWORD属性的编辑框内的文本. GetWindowText(hWnd, str, 100);也不性 解决方案 http://www

详解Python如何获取列表(List)的中位数_python

前言 中位数是一个可将数值集合划分为相等的上下两部分的一个数值.如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数:如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数.在这个任务里,你将得到一个含有自然数的非空数组(X).你必须把它分成上下两部分,找到中位数. 输入: 一个作为数组的整数(int)列表(list)的. 输出: 数组的中位数(int, float).  示例 get_median([1, 2, 3, 4, 5]) == 3 get_medi