我试图使用快速傅立叶变换来提取单个正弦函数的相移.我知道在纸上,如果我们将函数转换为T,那么我们有以下关系:
然而,我发现虽然我能够准确地捕获余弦波的频率,但是相位不准确,除非我以极高的速率进行采样.例如:
import numpy as np
import pylab as pl
num_t = 100000
t = np.linspace(0,1,num_t)
dt = 1.0/num_t
w = 2.0*np.pi*30.0
phase = np.pi/2.0
amp = np.fft.rfft(np.cos(w*t+phase))
freqs = np.fft.rfftfreq(t.shape[-1],dt)
print (np.arctan2(amp.imag,amp.real))[30]
pl.subplot(211)
pl.plot(freqs[:60],np.sqrt(amp.real**2+amp.imag**2)[:60])
pl.subplot(212)
pl.plot(freqs[:60],(np.arctan2(amp.imag,amp.real))[:60])
pl.show()
Run Code Online (Sandbox Code Playgroud)
使用num = 100000点我得到一个1.57173880459的阶段.
使用num = 10000点我得到一个1.58022110476的阶段.
使用num = 1000点我得到1.6650441064的阶段.
出了什么问题?即使有1000分,我每周期有33分,这应该足以解决它.有没有办法增加计算频率点的数量?有没有办法用"低"点数做到这一点?
编辑:从进一步的实验看来,我需要每周期~1000点才能准确地提取相.为什么?!
编辑2:进一步的实验表明,准确性与每个周期的点数有关,而不是绝对数.增加每个周期的采样点数可以使相位更准确,但如果信号频率和采样点数都增加相同因子,则精度保持不变.
我有一段代码可以分析来自非常大(10-100GB)二进制文件的数据流.它运行良好,所以是时候开始优化了,目前磁盘IO是最大的瓶颈.
有两种类型的文件正在使用中.第一种类型的文件由16位整数流组成,必须在I/O之后进行缩放,以转换为物理上有意义的浮点值.我以块的形式读取文件,并通过一次读取一个16位代码,执行所需的缩放,然后将结果存储在数组中来读取数据块.代码如下:
int64_t read_current_chimera(FILE *input, double *current,
int64_t position, int64_t length, chimera *daqsetup)
{
int64_t test;
uint16_t iv;
int64_t i;
int64_t read = 0;
if (fseeko64(input, (off64_t)position * sizeof(uint16_t), SEEK_SET))
{
return 0;
}
for (i = 0; i < length; i++)
{
test = fread(&iv, sizeof(uint16_t), 1, input);
if (test == 1)
{
read++;
current[i] = chimera_gain(iv, daqsetup);
}
else
{
perror("End of file reached");
break;
}
}
return read;
}
Run Code Online (Sandbox Code Playgroud)
chimera_gain函数只需要一个16位整数,对其进行缩放并返回双精度进行存储.
第二种文件类型包含64位双精度数,但它包含两列,其中我只需要第一列.要做到这一点,我会双击双打并丢弃第二个双打.双重必须在使用前进行字节交换.我用来做这个的代码如下:
int64_t read_current_double(FILE *input, double *current, int64_t …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 中的数据图顶部绘制一个矩形matplotlib。为此,我有这段代码
import matplotlib.patches as patches
import matplotlib.pyplot as pl
...
fig = pl.figure()
ax=fig.add_axes([0,0,1,1])
ax.add_patch(
patches.Rectangle(
(776820, 5000), # (x,y)
3000, # width
3500, # height
fill=False
)
)
ax.plot(signal)
ax.plot(fit)
...
Run Code Online (Sandbox Code Playgroud)
然而,当我这样做时,矩形位于数据后面。如果我在绘制实际数据之前或之后添加矩形似乎并不重要。如何确保矩形是图中最上面的元素?
我正在接管一些在 php中使用eval()函数的网页游戏代码。我知道这可能是一个严重的安全问题,因此在我决定是否取消该部分代码之前,我需要一些帮助来审查检查其参数的代码。目前我已经从游戏中删除了这部分代码,直到我确定它是安全的,但功能的损失并不理想。我宁愿对此进行安全证明,也不愿重新设计整个段以避免使用 eval(),假设这样的事情是可能的。据称可以防止恶意代码注入的相关代码片段如下。$value 是一个用户输入的字符串,我们知道它不包含“;”。
1 $value = eregi_replace("[ \t\r]","",$value);
2 $value = addslashes($value);
3 $value = ereg_replace("[A-z0-9_][\(]","-",$value);
4 $value = ereg_replace("[\$]","-",$value);
5 @eval("\$val = $value;");
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的理解:
1) 从 $value 中删除所有空格
2)转义数据库调用需要它的字符(我不清楚为什么需要它)
3) 查找字母数字字符后紧跟 \ 或 ( 并用 - 替换它们的组合。大概这是为了删除字符串中与函数调用类似的任何内容,尽管我不清楚为什么它还删除前面的字符,这就是为什么在第 2 行明确添加它们之后,它也会删除 \。
4) 用 - 替换 $ 的所有实例,以避免任何类似于对字符串中 php 变量的引用。
那么:这里有没有留下任何漏洞?我是否误解了上面的任何正则表达式?最后,有没有办法在不排除 ( 字符?要输入的字符串是理想的数学公式的情况下对此进行安全证明,并且允许 ( 将允许操作操作顺序,目前这是不可能的。
我有一个拟合函数,其形式如下:
def fit_func(x_data, a, b, c, N)
Run Code Online (Sandbox Code Playgroud)
其中a、b、c是lenth N的列表,其中的每一项都是scipy.optimize.curve_fit()中要优化的可变参数,N是用于循环索引控制的固定数。
按照这个问题,我想我可以修复 N,但我目前正在调用 curve_fit 如下:
params_0 = [a_init, b_init, c_init]
popt, pcov = curve_fit(lambda x, a, b, c: fit_func(x, a, b, c, N), x_data, y_data, p0=params_0)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误: lambda() 正好采用 Q 个参数(给定的 P)
Q 和 P 的变化取决于我的设置方式。
那么:对于初学者来说,这甚至可能吗?我可以将列表作为参数传递给 curve_fit 并具有我希望的行为,其中它将列表元素视为单个参数吗?假设答案是肯定的,那么我的函数调用做错了什么?
我试图使用自相关是功率谱的逆傅里叶变换的属性来计算信号的自相关.但是,当我使用scipy(或numpy)fft执行此操作并与自相关函数的直接计算进行比较时,我得到了错误的答案,具体而言,fft版本在较大的延迟时间内以较小的负值进行关闭,这是显然错了.
我的MWE低于输出.我使用fft错了吗?
import numpy as np
import matplotlib.pyplot as pl
from scipy.fftpack import fft, ifft
def autocorrelation(x) :
xp = (x - np.average(x))/np.std(x)
f = fft(xp)
p = np.absolute(f)**2
pi = ifft(p)
return np.real(pi)[:len(xp)/2]/(len(xp))
def autocorrelation2(x):
maxdelay = len(x)/5
N = len(x)
mean = np.average(x)
var = np.var(x)
xp = (x - mean)/np.sqrt(var)
autocorrelation = np.zeros(maxdelay)
for r in range(maxdelay):
for k in range(N-r):
autocorrelation[r] += xp[k]*xp[k+r]
autocorrelation[r] /= float(N-r)
return autocorrelation
def autocorrelation3(x):
xp = (x - np.mean(x))/np.std(x)
result …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的 GUI 来绘制csv文件中的数据,我将其读入 pandas DataFrame。我对 GUI 编程完全陌生,我很难理解像 Tkinter 这样的事件驱动设置。
作为一个简单的练习,我想成立了两个按钮,一个打开一个文件,并在读取DataFrame,而另一个打印出所产生的DataFrame。我的第一次天真尝试没有奏效:
import pandas as pd
import tkFileDialog
import Tkinter as tk
def open_events_db():
file_path_string = tkFileDialog.askopenfilename()
eventsdb = pd.read_csv(file_path_string,encoding='utf-8')
return eventsdb
def print_events_db(eventsdb):
print eventsdb
def main():
root=tk.Tk()
eventsdb = tk.Button(text='File Open', command=open_events_db).pack(fill=tk.X)
tk.Button(text='Print DB', command=lambda:print_events_db(eventsdb)).pack(fill=tk.X)
tk.mainloop()
if __name__=="__main__":
main()
Run Code Online (Sandbox Code Playgroud)
我可以很好地读入文件并打开它,但事后看来显然我无法eventsdb从文件打开按钮返回并将其作为打印按钮的参数。
不过,我认为在该数据库上运行按钮并不是不合理的,那么在 GUI 中传递变量的正确方法是什么?
python ×3
fft ×2
numpy ×2
python-2.7 ×2
scipy ×2
c ×1
eval ×1
io ×1
matplotlib ×1
optimization ×1
php ×1
security ×1
tkinter ×1