在Python中证明傅里叶变换运算

2023-12-01

我有一个时域表达式

f = -1j*H(t) * exp(-(1j*a+b)*t)

可以使用解析傅立叶变换已知属性 (H是亥维赛阶跃函数)。该 FT 运算的结果是

F = (w-a-1j*b)/((w-a)**2+b**2)

where w是频率。

现在我正在使用中的提示本文进行数值傅里叶变换f在Python中,并确认我确实得到了相同的分析结果F:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(-10,10,1e4) # time
w = np.linspace(-10,10,1e4) # frequency

b = 0.1
a = 1

H = lambda x: 1*(x>0) # heaviside function

# function in time
f = -1j*H(t)*np.exp(-(1j*a+b)*t)

# function in frequency (analytical work)
F = (w-a-1j*b)/((w-a)**2+b**2)

hann = np.hanning(len(t))  # hanning window

# function in frequency (numerical work)
F2 = 2/len(t)*np.fft.fft(hann*f)

plt.figure()
plt.plot(w,F.real,'b',label='analytical')
plt.plot(w,F2.real,'b--',label='fft')
plt.xlabel(r'$\omega$')
plt.ylabel(r'Re($F(\omega)$)')
plt.legend(loc='best')

plt.figure()
plt.plot(w,F.imag,'g',label='analytical')
plt.plot(w,F2.imag,'g--',label='fft')
plt.xlabel(r'$\omega$')
plt.ylabel(r'Im($F(\omega)$)')
plt.legend(loc='best')

plt.show()

然而Python的FFT函数似乎给了我一些完全错误的东西。当F and F2被绘制。

Edit:这是情节...

在这些图中并不明显,但如果你放大w=-10 and 10区域存在小幅波动,可能是由于fft算法。


FFT 算法计算 DFT,其原点(空间域和频域)位于第一个样本上。您需要移动信号(在应用汉宁窗之后),以便 t=0 是最左边的样本,并且在计算 FFT 后,您必须进行反向移动。

MATLAB 有ifftshift and fftshift,实现这两个转变。 NumPy 一定有类似的功能。

代码的另一个问题是计算 DFT,并将其绘制在由w您计算的频率,但与计算 DFT 的实际频率无关。

这是您的代码,已转换为 MATLAB,并已修复以正确计算F2 and w*。我希望这有用。需要注意的一件事是你的F不匹配F2,我确信这不是由于错误F2,但是您的计算出现错误F。形状相似,但是F以不同的方式缩放和镜像。

N = 1e3;
t = linspace(-100,100,N); % time
Fs = 1/(t(2)-t(1));
w = Fs * (-floor(N/2):floor((N-1)/2)) / N; % NOTE proper frequencies

b = 0.1;
a = 1;

H = @(x)1*(x>0); % Heaviside function

% function in time
f = -1j*H(t).*exp(-(1j*a+b)*t);

% function in frequency (analytical work)
F = (w-a-1j*b)./((w-a).^2+b.^2);

% hanning window
hann = 0.5*(1-cos(2*pi*linspace(0,1,N)));

% function in frequency (numerical work)
F2 = fftshift(fft(ifftshift(hann.*f))); % NOTE shifting of origin

figure

subplot(2,1,1), hold on
plot(w,real(F),'b-')
plot(w,real(F2),'r-')
xlabel('\omega')
ylabel('Re(F(\omega))')
legend({'analytical','fft'},'Location','best')

subplot(2,1,2), hold on
plot(w,imag(F),'b-')
plot(w,imag(F2),'r-')
xlabel('\omega')
ylabel('Im(F(\omega))')
legend({'analytical','fft'},'Location','best')

output of code

Footnote:
* I also changed the colors, MATLAB's green is too light.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中证明傅里叶变换运算 的相关文章

随机推荐

  • 如何将函数应用于 data.frame 的每个元素?

    我想将一个数值转换为一个因子 如果该值低于 2 则 down 应该是因子 如果它高于2 则 up 和 no change 之间 到目前为止我考虑过创建一个函数 classifier lt function x if x gt 2 retur
  • APDU 在 mifare classic 上写入块命令

    我一直在尝试将一些数据写入我的 Mifare 经典卡 首先我发送这两个命令 返回 90 00 加载 Mifare 钥匙 FF 82 20 01 06 FF FF FF FF FF FF 认证 FF 86 00 00 05 01 00 01
  • 制作 iPhone 应用程序时是否可以嵌入或加载 SWF(Apple 是否允许)

    我对在为 iphone 制作应用程序时是嵌入 swf 还是加载它们有点困惑 有谁知道每个的优点是什么 最好使用哪个 我知道嵌入 swf 应该比加载它们快一点 但这就是全部吗 另外 这一点很重要 我读到苹果将拒绝任何带有外部 swf 的应用程
  • Android 中读取文本文件并以 TextView 形式输出

    我正在尝试读取已保存在我的目录中的文本文件并将其作为 TextView 打印在屏幕上 这是我到目前为止所拥有的代码 但是 当我运行该应用程序时 它会创建一个 toast 上面写着 读取文件时出错 我在这里做错了什么 public class
  • 数据网格视图更新

    我在 C 中使用 2005 Windows 窗体 我只花了一天的时间 所以请放轻松 我想要一个提交按钮来保存对 DataGridView 的更改 我已将数据存入 DGV 并可以编辑 但卡在 Update 上 我创建了一个名为 scDB 的
  • $.browser 的替代品是什么

    jQuery 文档标签 browser已弃用 那么它的替代品是什么 基于jQuery 迁移插件 我找到了这个 jQuery uaMatch function ua ua ua toLowerCase var match chrome w e
  • INotifyPropertyChanged 不会导致此代码中的屏幕更新

    下面的代码是基于此post 我的问题 我看不出我做错了什么来让 INotifyPropertyChanged 导致 textBox1 绑定自动反映这个简单示例中的更改 XAML 我添加了 textBox2 以确认属性正在更改
  • 观察者模式应该包括一些无限循环检测吗?

    快速浏览一下GoF和Head First Design Patterns这本书 似乎没有提到观察者模式的无限循环检测和处理 我认为如果是在2个类之间 我们可以更加小心无限循环问题 但是如果有5个类或12个类 并且观察者走向多个方向怎么办 在
  • Twitter bootstrap 输入标签无法与 Jquery before() 一起使用

    我正在使用 Jquery 克隆 一个 div 并更改其子级的 id 其中一个子级是Bootstrap标签输入 你可以找到一个演示在这里 点击后添加新运行添加了新的 div 但标签输入不可编辑 这是我的代码 您可以查看完整代码here add
  • 使用 OpenId AppAuth-Android 库时,具有隐式意图的 PendingIntent 返回已取消异常

    我正在尝试实现 oauth2 以使用户能够使用 Reddit 登录 我已经使用适当的重定向 uri 在 reddit 上创建了我的应用程序 我做了什么 带有登录按钮的 MainActivity 单击登录按钮 启动授权流程 要创建授权请求 我
  • mysql触发器操作数应包含2列

    我的触发器看起来像这样 begin IF NEW tgebucht gt NEW tteilnmax AND NEW tgebucht 0 AND OLD tstatus 0 THEN SET NEW tstatus 1 ELSEIF NE
  • 如何使用新的 HTML5 Boilerplate 来定位 IE9?

    我正在尝试为 IE 指定一个类 但是 由于样板模板已更改 因此不再有效 myclass do something ie7 myclass do something 这是样板模板的新标题中的内容
  • JavaMail base64 编码

    我有一些 Java 代码 它会发送一封电子邮件 代码如下 MimeBodyPart part new MimeBodyPart part setContent htmlString text html charset UTF 8 part
  • 如何解决 Rails 插件上的 rake 任务弃用问题?

    由于引入的概念here Rails Plugin 只不过是一个 Rails Engine 但由于它已加载 在启动过程中为时已晚 它确实 不具有相同的配置权力 作为一个裸露的 Rails Engine 与 Rails Railtie 相对并且
  • NestJS/TypeORM:无法设置只有 getter 的 # 的属性元数据

    我尝试运行我的 Nestjstutorial 应用程序 显示以下错误 我的后端连接到 PostgreSQL 数据库 TypeError 无法设置只有 getter 的 属性元数据 在 EntityManager getCustomRepos
  • 使用代码默认值对集合属性进行 XML 反序列化

    对于应用程序配置 我经常会创建一个配置类 其中包含应用程序的配置值 然后将其反序列化为要使用的对象 配置对象通常与用户界面控件进行数据绑定 以便用户可以更改和保留配置 配置类通常具有分配给属性的默认值 以便始终存在默认配置 这效果很好 我最
  • Prolog - 将列表的偶数元素乘以数字 (F)

    我正在 Prolog 中编程 从任何给定的数字 F 开始 将列表中的偶数元素相乘 保留那些不是的值 开发了以下内容 实际上程序 编译 没有任何错误 但在输入值时它只返回 false 我哪里可能错了 base case evenproduct
  • 禁用 Pygame 控制台输出 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在Python中抑制控制台输出 目前我正在使用 pygame 读取操纵杆输入 我需要解决以下问题 当调用操纵杆模块中的函数时 例如get axis or get button 该函数打印出诸如SD
  • ListView 项目的原始坐标

    我有以下问题 在我的布局上 我有一个操作栏 例如 高度为 150dp 其余的是 ListView 我可以从操作栏中获取一些视图并将其拖动到列表视图上 拖动是通过windowsmanager实现的 所以当拖动时我得到原始Y坐标 现在 我想将
  • 在Python中证明傅里叶变换运算

    我有一个时域表达式 f 1j H t exp 1j a b t 可以使用解析傅立叶变换已知属性 H是亥维赛阶跃函数 该 FT 运算的结果是 F w a 1j b w a 2 b 2 where w是频率 现在我正在使用中的提示本文进行数值傅