- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 python numpy/scipy 的 fft、rfft 和 dct 转换回正弦/余弦波之和,以重建原始数据集。我想这样做是因为我希望能够用更多/更少的采样点重建原始数据集(我相信可能已经被 scipy.signal.resample 覆盖),主要是因为我想将正弦/余弦系列扩展到 future 与在某些系列中使用线性回归来给出 future 值的一般概念没有什么不同。我知道这在技术上是不正确的,因为 fft 假设离散样本在所有时间点上重复,而 dct 假设数据是“镜像的”,但我认为它可能具有某种短期预测值(value)。
我尝试遵循此处编写的内容作为 Numpy 分解算法的指南: http://snowball.millersville.edu/~adecaria/ESCI386P/esci386-lesson17-Fourier-Transforms.pdf
这是我的代码:
import numpy as np
from scipy.fftpack import fft,ifft,dct,idct,rfft,irfft
import matplotlib.pyplot as plt
def reconstructSeries(transformedVals,newxvals):
transformedVals=transformedVals.astype('complex128')
transformedVals=transformedVals/len(transformedVals) #for some reason, numpy does not normalize the values it has, so I have to do it here.
reconstructedVals=np.zeros(len(newxvals))
series=[]
# perhaps [:len(transformedVals)//2] ?
for frequency,val in enumerate(transformedVals):
#the position of the coefficient is the frequency (in radians)
#amplitude=np.sqrt(np.real(val)**2+np.imag(val)**2)
#phase=np.arctan(np.imag(val)/np.real(val))
series.append(lambda x: np.real(val)*np.cos(frequency*newxvals)-np.imag(val)*np.sin(frequency*newxvals))
#series.append(lambda x: amplitude*np.cos(2*np.pi*frequency*newxvals+phase)) #this is in radians to accomidate phase and the default cosine function
reconstructedVals=reconstructedVals+np.array(series[frequency](newxvals))
return reconstructedVals,series
#y=np.arange(250)
y=np.cos(np.arange(250)+5)
yf = fft(y) #this can be rfft or dct as well
myyvalues,sinosoidseries=reconstructSeries(yf,np.arange(250))
plt.plot(ifft(yf));plt.plot(y);plt.plot(myyvalues);plt.show()
这段代码的作用是:
在这个特定的代码中,我试图看看我的重组是否等于原始系列/scipy 的逆分解,只是为了确保我做得正确。我认为代码工作正常,但它用于正弦/余弦重建的基础公式是错误的。以下是此特定代码的输出:
绿色是我重建的值,橙色/蓝色是原始值。显然,我的算法没有正确地重新制作该系列。正如其他网站上所建议的那样,使用幅度和相位将正弦和余弦项组合成单个余弦项,会给出不同但仍然不正确的结果,很可能是由于减去了上面建议的正弦项来源。有谁知道我的公式或代码是错误的吗?我认为它要么是在 cos()-sin() 部分,要么是频率没有乘以常数之类的东西。
*注意:我知道这个问题有点像: Fourier Series from Discrete Fourier Transform但我认为这个问题的答案对我来说不起作用。
最佳答案
我在代码中看到的错误在于复数乘法:将频域样本的实部与 cos 相乘,将虚部与 sin 相乘。这不是复数乘法的工作原理。您需要将复数样本值与复数值 cos + i sin 相乘。复数 a+ib 和 c+id 相乘时产生 ac-bd+iad+ibc,而不是 ac+bd。
<小时/>编辑:如何用零填充频域以进行插值
The SciPy ifft
function有一个参数n
,您可以使用该参数在转换之前用零填充数组。不要使用该参数。它会在信号末尾添加零,破坏信号的对称性,因此通常会产生非真实结果。
DFT(fft
计算的内容)的频率为 k
=0
...N-1
。但k
是周期性的,这意味着k=N-1
与k=-1
相同。我们需要保留实值时域信号的傅里叶域中存在的围绕 k=0
的(复共轭)对称性,这意味着 频域信号的值>k=1
和 k=-1
必须保持这种对称性(对于 k=2
和 k=-2
也是如此等)。
当用零填充时,我们增加这个值N
,因此我们也改变k=-1
在数组中的位置(因为它在k =N-1
,增加N
表示该位置移动)。
因此,填充必须在数组中间添加零,以便保留数组开头和结尾的原始值。数组的中间位于 (N+1)//2-1
和 (N+1)//2
之间:
N = 250
y = np.cos(np.arange(N)+5)
yf = fft(y)
yf = np.concatenate((yf[:(N+1)//2], np.zeros(N), yf[(N+1)//2:]))
y2 = ifft(yf)
plt.subplot(2,1,1)
plt.plot(y,'.-')
plt.subplot(2,1,2)
plt.plot(y2,'.-')
plt.show()
请注意时域信号如何保持不变,但样本数量增加一倍。
另请注意,这不会进行推断:如果您扩展组成 y
的正弦波和余弦波,您将从信号的开头重建值,如 y
以这种方式重构的code>是周期性的。即y[N]==y[0]
、y[N+1]==y[1]
等
关于python - 通过离散傅里叶变换对傅里叶级数进行建模以进行外推,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51182265/
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
从以下网站,我找到了执行java AD身份验证的代码。 http://java2db.com/jndi-ldap-programming/solution-to-sslhandshakeexcepti
似乎 melt 会使用 id 列和堆叠的测量变量 reshape 您的数据框,然后通过转换让您执行聚合。 ddply,从 plyr 包看起来非常相似..你给它一个数据框,几个用于分组的列变量和一个聚合
我的问题是关于 memcached。 Facebook 使用 memcached 作为其结构化数据的缓存,以减少用户的延迟。他们在 Linux 上使用 UDP 优化了 memcached 的性能。 h
在 Camel route ,我正在使用 exec 组件通过 grep 进行 curl ,但使用 ${HOSTNAME} 的 grep 无法正常工作,下面是我的 Camel 路线。请在这方面寻求帮助。
我正在尝试执行相当复杂的查询,在其中我可以排除与特定条件集匹配的项目。这是一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我正在尝试执行相当复杂的查询,我可以在其中排除符合特定条件集的项目。这里有一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我发现了很多嵌入/内容项目的旧方法,并且我遵循了在这里找到的最新方法(我假设):https://blog.angular-university.io/angular-ng-content/ 我正在尝试
我正在寻找如何使用 fastify-nextjs 启动 fastify-cli 的建议 我曾尝试将代码简单地添加到建议的位置,但它不起作用。 'use strict' const path = req
我正在尝试将振幅 js 与 React 和 Gatsby 集成。做 gatsby developer 时一切看起来都不错,因为它发生在浏览器中,但是当我尝试 gatsby build 时,我收到以下错
我试图避免过度执行空值检查,但同时我想在需要使代码健壮的时候进行空值检查。但有时我觉得它开始变得如此防御,因为我没有实现 API。然后我避免了一些空检查,但是当我开始单元测试时,它开始总是等待运行时异
尝试进行包含一些 NOT 的 Kibana 搜索,但获得包含 NOT 的结果,因此猜测我的语法不正确: "chocolate" AND "milk" AND NOT "cow" AND NOT "tr
我正在使用开源代码共享包在 iOS 中进行 facebook 集成,但收到错误“FT_Load_Glyph failed: glyph 65535: error 6”。我在另一台 mac 机器上尝试了
我正在尝试估计一个标准的 tobit 模型,该模型被审查为零。 变量是 因变量 : 幸福 自变量 : 城市(芝加哥,纽约), 性别(男,女), 就业(0=失业,1=就业), 工作类型(失业,蓝色,白色
我有一个像这样的项目布局 样本/ 一种/ 源/ 主要的/ java / java 资源/ .jpg 乙/ 源/ 主要的/ java / B.java 资源/ B.jpg 构建.gradle 设置.gr
如何循环遍历数组中的多个属性以及如何使用map函数将数组中的多个属性显示到网页 import React, { Component } from 'react'; import './App.css'
我有一个 JavaScript 函数,它进行 AJAX 调用以返回一些数据,该调用是在选择列表更改事件上触发的。 我尝试了多种方法来在等待时显示加载程序,因为它当前暂停了选择列表,从客户的 Angul
可能以前问过,但找不到。 我正在用以下形式写很多语句: if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 我想到了三元运算符,但我认
我有一个表单,在将其发送到 PHP 之前我正在执行一些验证 JavaScript,验证后的 JavaScript 函数会发布用户在 中输入的文本。页面底部的标签;然而,此消息显示短暂,然后消失...
我是一名优秀的程序员,十分优秀!