python-3.x - 如何计算(供以后使用)具有非常高频率的波?
问题描述
我正在运行一个与可见光相关的物理模拟,得到的波函数有一个非常非常高的频率——循环频率大约是1.0e15
,空间频率k
大约是1.0e7
。谢天谢地,我只使用空间频率,但是当我计算它以供以后使用时(使用math
or numpy
),我得到类似于拍波的东西,除非我使用N
~=k
样本点,因为我必须在更大的范围内计算它范围(按 的顺序1.0e-3 - 1.0e-1
)。它产生了一个拍波,所以我花了几个小时来确保我实际上没有计算一个。我还必须fft()
在生成的 wave 上使用,我担心它不能与错误描述的 wave 一起正常工作。
我尝试过使用不同数量的样本点,但除非它非常高(需要一两分钟来计算),否则只有跳动的突出程度会发生变化。以防万一我误用了 numpy,我尝试了相同的方法,将wave.value
计算结果附加math.sin
到浮点数组,但结果相同。
import numpy as np
import matplotlib.pyplot as plt
mmScale = 1.0e-3
nmScale = 1.0e-9
c = 3.0e8
N = 1000
class Wave:
def __init__(self, amplitude, wavelength):
self.wavelength = wavelength*nmScale
self.amplitude = amplitude
self.omega = 2*pi*c/self.wavelength
self.k = 2*pi/self.wavelength
def value(self, time, travel):
return self.amplitude*np.sin(self.omega*time - self.k*travel)
x = np.linspace(50, 250, N)*mmScale
wave = Wave(1, 400)
y = wave.value(0.1, x)
plt.plot(x,y)
plt.show()
上面的代码生成了函数图,您可以输入不同的值N
来查看它如何给出不同的波形。
解决方案
您的采样空间频率为:
1/Ts = 1 / ((250-50)*mmScale) / N) = 5000 [samples/meter]
你的波的空间频率是:
1/Tw = 1 / wavelength = 1 / (400e-9) = 2500000 [wavelengths/meter]
您未能满足 Nyquist 标准的一个因子(2*2500000 ) / 5000 = 1000
。因此,您必须预料到严重的混叠效应。请参阅https://en.wikipedia.org/wiki/Aliasing。
没有什么可以做的。但是根据应用程序,有些技巧可能会对您有所帮助。一种是将波表示为围绕载波频率的复包络,即 400e-9。请提供有关您如何处理 wave 的更多详细信息。
推荐阅读
- html - 如何在 MaterializeCSS 的阴影下移动元素?
- php - 访问并打印包含数字的特定 JSON 值
- flutter - 为什么在 Flutter 的 Chewie 视频中没有全屏应用更改主题?
- sql - 计算库存 OpeningQuantity、QuantityIn、QuantityOut 和 ClosingQuantity
- flutter - 如何使按钮更靠近 Flutter
- winapi - 为什么 WTSFreeMemoryExA 在传递 WTSTypeSessionInfoLevel1 的 WTSTypeClass 时总是返回 ERROR_INVALID_PARAMETER?
- c# - TableLayoutPanel 不显示最后 10 行数据
- flutter - 有没有办法在 Flutter Web 中制作 Facebook 分享按钮?
- python - py_proto_library 是否与配置了 strip_import_prefix 的 proto_library 目标一起使用
- javascript - foreach 循环内的世博会推送通知