- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些复杂的数据(围绕设定频率的小带宽),我很想绘制这些数据,但对于如何继续解释在特定范围内采样的复杂信号,我有点不知所措。
因此,例如,这是我编写的代码(以及我对这个问题的相当糟糕的尝试),所以我有一个干净的例子来试验人工信号,它生成 78 KHz 波的复杂表示。我想要做的是获得一个以 120 KHz 为中心、范围从 70 到 170 KHz 的图,模拟真实接收器的窄采样范围。
import numpy as np
import matplotlib.pyplot as plt
#sampling rate, samples/second; 100 KHz
rate = 100*10**3
#sample spacing in time, seconds/sample
interval = np.true_divide(1, rate)
#length of the fourier transform
n = 256
#time vector
t = np.linspace(0.0, n*interval, n)
#frequency of artificial signal; 78 KHz
f = 78*10**3
#complex signal
s = np.exp(1j*2*np.pi*f*t)
#dft of the data
dft = np.fft.fft(s)
#frequency bins
x = np.fft.fftfreq(n, d=interval)
#center zero-frequency component in data; take absolute values
dft = np.abs(np.fft.fftshift(dft))
#center zero frequency component in bins; naively add the center frequency, 120 KHz
x = np.fft.fftshift(x) + 120*10**3
plt.plot(x, dft)
plt.show()
输出是错误的,正如对模仿特定频率范围的粗略尝试所预期的那样。
Plot made by the code snippet above
附言Different plot , f = 88*10*83
- 为什么这里的大小突然改变了?
编辑:我的帖子已被标记为与纯粹与绘图相关的主题重复,而我实际上是在处理和/或反转带通滤波数据。
最佳答案
您的信号应该是 +78 kHz 的(复数)指数振荡,以 100 kHz 采样。 This doesn't work .您看到的是 -22 kHz(78 kHz - 100 kHz)的混叠频率。您必须确保信号的频率不高于采样频率的一半。例如,对于 78 kHz 的信号,采用 200 kHz 的采样频率。
import numpy as np
from matplotlib import pyplot as plt
sample_frequency = 200e3 # 200 kHz
sample_interval = 1 / sample_frequency
samples = 256 # you don't necessarily have to use a power of 2
time = np.linspace(0, samples*sample_interval, samples)
signal_frequency = 78e3 # 78 kHz
signal = np.exp(2j*np.pi*signal_frequency*time)
fftfreq
np.fft.fftfreq
已经返回正确的频率,添加“中心频率”毫无意义。不要这样做。
signal_spectrum = np.fft.fftshift(np.fft.fft(signal))
freqs = np.fft.fftshift(np.fft.fftfreq(samples, d=sample_interval))
您问题的绘图部分仅与设置轴有关。使用 plt.xlim
.
plt.figure(figsize=(10,5))
plt.plot(freqs / 1e3, np.abs(signal_spectrum)) # in kHz
plt.xlim(70, 170)
绘制的线恰好在 100 kHz 之前结束,因为如上所述,您的信号的频率部分不能高于您的半采样频率。
由于您的信号是时间离散的(多个单个样本,不是连续函数),您的频谱是连续的。 Discrete Fourier Transform , 然而,只返回连续谱的离散样本。如果您通过采样点拟合一条曲线,则其峰值对于不同的频率将具有相同的幅度。
或者,您可以通过零填充您的信号来增加 FFT 采样点的数量(查看 numpy.fft.fft
documentation ):
signal_spectrum = np.fft.fftshift(np.fft.fft(signal, 10*samples))
freqs = np.fft.fftshift(np.fft.fftfreq(10*samples, d=sample_interval))
plt.figure(figsize=(10,5))
plt.plot(freqs / 1e3, np.abs(signal_spectrum)) # in kHz
plt.xlim(65, 95).
plt.grid()
如果您问自己为什么频谱看起来如此起伏,请查看 spectral leakage .
关于python - 绘制在窄范围内采样的复杂信号的频谱的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37636017/
我想在DIV中做竖线 然后我想在垂直线上对 img 进行分层。(图片是我想要的结果) 我的源代码是这样的。 如何对这些元素进行分层??? 最佳答案 您需要做一些数学运算才能在中心调整它。 .ou
出于各种原因,我正在创建一个网站(尚未在线),该网站具有单独的移动页面。我想向“监控”站点添加一些内容,上面写着“如果浏览器宽度小于 X 像素,请查看 *mobilepagename.html 而不是
当尝试使用 jstat 监视 JVM 的性能时,我看到以下几行 - Timestamp PC PU OC **OU** YGC
html Lorem Ipsum... CSS #outer { background: url('mypic.jpg') no-repeat center top; } #i
我正在使用 sun-codemodel 生成代码。我对泛型有疑问。我知道要生成类似的东西 LinkedList, 我需要用 JType jtype = jCodeModel.ref("LinkedLi
考虑一个简单的系统,其中 PS(处理器系统)启用了 AXI3 主设备,连接到 AXI4 互连,该 AXI4 互连连接到可以访问 BRAM 内存的 BRAM Controller 。 AXI 窄突发的含
我在 Windows 上有一个狭窄的 Python 2.7.6 版本。我还有一个包含“窄”( 0xFFFF) Unicode 代码点的字符串。 >>> wide1 = u'\U0002b740' >>
我有一个函数可以验证 JSON 响应以确保它对应于给定的形状。 这是我定义所有可能的 JSON 值的类型——取自 https://github.com/microsoft/TypeScript/iss
我是一名优秀的程序员,十分优秀!