python - 我在 python 中的 fft() 有问题

标签 python numpy scipy fft

我有一个函数,我应该绘制 10MHz 到 11.4MHz 之间的幅度谱。这是函数:cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t))) 我知道情节应该是什么样子,但我的完全错了.我很确定这是一个编程错误,而不是数学/理论错误,因为我正在做的正是 MatLab 示例所显示的内容,但我觉得 Python 正在做一些我不理解的事情。我应该以 10ns 的间隔对该函数进行 8192 次采样,将其乘以汉明窗口,并绘制 10MHz 和 11.4MHz 之间以 dB 为单位的幅度谱。载波 (10.7MHz) 应在 55 dB 左右。第二对边带的最大振幅为 60 dB。然后,第五对边带是 20 dB 点,因此约为 40 dB。任何人都可以发现这段代码有什么问题可以解释为什么我的代码没有显示吗?

import numpy
import scipy
import scipy.fftpack
import matplotlib
import matplotlib.pyplot as plt
from scipy import pi
import pylab
from pylab import *
import cmath
import sys
sys.setrecursionlimit(10000)

samples = 8192

#Defining the test function
t = scipy.linspace(0.01, 32/390625, samples, False)   #Sample samples times at 10ns apart
#The samples is non-inclusive, it goes from 0 to samples-1.
x_t = cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t)))  #Define x(t)
acc = lambda t: (x_t)                             #Define x[t] in terms of t as a variable in Python's eyes 

signal = acc(t)                 #Make signal a function of t
plt.subplot(211)                #Set up a plot
plt.xlabel('Ohmega (Hz)')       #Label x axis
plt.ylabel('Amplitude of sampled x(t) (dB)')  #Label y axis

window = numpy.hamming(samples)    #Make a hamming window 


w = scipy.linspace(0, 100*10**6, samples, False)   #Create Ohmega between 1/(10ns)
signal = signal * window        #Multiply by the hamming window
signal = scipy.fft(signal)      #Take the FFT
signal = abs(20*log10(signal))  #Get the magnitude in dB scale

plt.xlabel('Ohmega')            #Label x axis
plt.ylabel('|F[w]|')            #Label y axis
#marker, stemlines, baseline = stem(w,signal, 'b-..')    #Plot with stemlines
plot(w,signal, 'b-')
plt.xlim(10*10**6, 11.4*10**6)  #Set x-limits

plt.show()                      #Show the plot

感谢您的帮助!

编辑:

我现在的代码:

import numpy
import scipy
import scipy.fftpack
import matplotlib
import matplotlib.pyplot as plt
from scipy import pi
import pylab
from pylab import *
import cmath
import sys
sys.setrecursionlimit(10000)

samples = 8192

#Defining the test function
t = scipy.linspace(0.01, 32/390625, samples, False)         #Sample samples times at 10ns apart
#The samples is non-inclusive, it goes from 0 to samples-1.
x_t = cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t)))            #Define x(t)
acc = lambda t: cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t)))  #Define x[t] in terms of t as a variable in Python's eyes 

#signal = acc(t)                 #Make signal a function of t
plt.subplot(211)                #Set up a plot
plt.xlabel('Ohmega (Hz)')       #Label x axis
plt.ylabel('Amplitude of sampled x(t) (dB)')  #Label y axis

window = numpy.hamming(samples)    #Make a hamming window 


w = scipy.linspace(0.01, 100*10**6, samples, False)   #Create Ohmega between 1/(10ns)
signal = lambda t: abs(20*log10(scipy.fft(acc*window)))
#acc = acc * window        #Multiply by the hamming window
#acc = scipy.fft(acc)      #Take the FFT
#acc = abs(20*log10(acc))  #Get the magnitude in dB scale

plt.xlabel('Ohmega')            #Label x axis
plt.ylabel('|F[w]|')            #Label y axis
#marker, stemlines, baseline = stem(w,signal, 'b-..')    #Plot with stemlines

plot(w,signal, 'b-')
plt.xlim(10*10**6, 11.4*10**6)  #Set x-limits

plt.show()                      #Show the plot

错误...:

    Traceback (most recent call last):
  File "/home/hollis/Documents/ELEN 322/ELEN_322_#2.py", line 39, in <module>
    plot(w,signal, 'b-')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2467, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3893, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 322, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 300, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 240, in _xy_from_xy
    raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension

虽然我之前已经看到并修复了这个错误,但我现在不知道如何修复它。显然,一个信号被采样了 8192 次,而决定它在哪里被采样的变量是不同的维度。我对这个很迷茫......

最佳答案

您的错误可能来自您定义 x(t) 的方式:

x_t = cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t)))  #Define x(t)
acc = lambda t: (x_t)  #Define x[t] in terms of t as a variable in Python's eyes

当 Python 执行第一行时,它使用 t 的当前值( scipy.linspace(0.01, 32/390625, samples, False) )。它不会将 t 解释为变量。

要解决此问题,请更改第二行:

acc = lambda t: cos(6.72*(10**7*t) + 3.2*sin(5*(10**5*t)))

编辑:刚刚注意到您对 signal 做了同样的事情。写作:signal = acc(t)(即使你修复了acc)只会分配函数acc(t)的结果(与t) 的当前值到变量信号。它不会是一个函数。 (为什么不直接使用 acc 而不是 signal,因为 acc 无论如何都是 t 的函数?)

关于python - 我在 python 中的 fft() 有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375784/

相关文章:

python - 从给定起始索引的一维数组中提取子数组 - Python/NumPy

python - Matlab到Python的转换: Read a text file into numpy records and search array for a string

arrays - 在python\openCV\numpy中创建图像数组

python - 对两个字典执行两个样本 Kolmogorov-Smirnov 检验

python - 如何在传递自定义 user_ns 和横幅时启动 ipython 应用程序实例?

python - 如何在 SimpleHTTPServer 中写入消息

python - 将数字的数字增加一位

python - 测试来自 Python 套接字异常的特定错误号

python - Hstacking 功能以某种方式导致预测速度额外放缓

python - 如何在 scipy.interpolate 中设置三次样条插值的第一个和最后一个斜率?