gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:53 24 4
gpt4 key购买 nike

我有一个函数,我应该绘制 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com