- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个程序来查找闭合平面曲线的椭圆傅里叶系数 (EFC),但在系数归一化方面遇到了问题。
闭合平面折线 p 由点集 m_points 描述:m_points[i][0] 保持 xi 坐标,m_points i保持 yi 坐标。我从 0 开始到 m_num_points-1。
折线的 EFC 由该算法计算(系数在 EFD 数组中)。
// calc accumulated curve length, delta x, and delta y
dt[0] := 0;
dx[0] := 0;
dy[0] := 0;
tp[0] := 0;
T := 0;
for i:=1 to p.m_num_points-1 do begin
va := VectorAffineSubtract(p.m_points[i], p.m_points[i-1]);
dt[i] := VectorLength( va );
dx[i] := p.m_points[i][0] - p.m_points[i-1][0];
dy[i] := p.m_points[i][1] - p.m_points[i-1][1];
tp[i] := tp[i-1] + dt[i];
T := tp[i];
end;
Tpi := T / (2*PI*PI);
piT := PI*2 / T;
// find elliptic fourier coefficients
// first
An := 0;
Cn := 0;
for i:=0 to p.m_num_points-1 do begin
An := An + (p.m_points[i][0] + p.m_points[i-1][0]) * dt[i] / 2;
Cn := Cn + (p.m_points[i][1] + p.m_points[i-1][1]) * dt[i] / 2;
end;
EFD[0][0] := An / T;
EFD[0][1] := 0;
EFD[0][2] := Cn / T;
EFD[0][3] := 0;
// next
for n:=1 to m_num_efd do begin
Tn := Tpi / (n*n);
piTn := piT * n;
An := 0;
Bn := 0;
Cn := 0;
Dn := 0;
for i:=1 to p.m_num_points-1 do begin
An := An + dx[i]/dt[i]*( cos(piTn*tp[i]) - cos(piTn*tp[i-1]) );
Bn := Bn + dx[i]/dt[i]*( sin(piTn*tp[i]) - sin(piTn*tp[i-1]) );
Cn := Cn + dy[i]/dt[i]*( cos(piTn*tp[i]) - cos(piTn*tp[i-1]) );
Dn := Dn + dy[i]/dt[i]*( sin(piTn*tp[i]) - sin(piTn*tp[i-1]) );
end;
EFD[n][0] := An * Tn;
EFD[n][1] := Bn * Tn;
EFD[n][2] := Cn * Tn;
EFD[n][3] := Dn * Tn;
end;
为了从谐波集中恢复折线,我使用了该算法。
// restore outline
resP := TYPolyline.create();
for i:=0 to p.m_num_points-1 do begin
xn := EFD[0][0];
yn := EFD[0][2];
for n:=1 to m_num_efd do begin
xn := xn + EFD[n][0] * cos(piT*n*tp[i]) + EFD[n][1] * sin(piT*n*tp[i]);
yn := yn + EFD[n][2] * cos(piT*n*tp[i]) + EFD[n][3] * sin(piT*n*tp[i]);
end;
resP.add_point( xn, yn );
end;
现在我需要规范化 EFD 并将它们放在一个新数组 NEFD 中。我这样做:
// Normalize EFD
An := EFD[0][0];
Bn := EFD[0][1];
Cn := EFD[0][2];
Dn := EFD[0][3];
for n:=0 to m_num_efd do begin
NEFD[n][0] := EFD[n][0];
NEFD[n][1] := EFD[n][1];
NEFD[n][2] := EFD[n][2];
NEFD[n][3] := EFD[n][3];
end;
// rotate starting point
angl_o := 0.5 * ArcTan2( 2*(An*Bn + Cn*Dn), An*An + Cn*Cn - Bn*Bn - Dn*Dn );
for n:=1 to m_num_efd+1 do begin
NEFD[n-1][0]:= EFD[n-1][0]*cos((n)*angl_o) + EFD[n-1][1]*sin((n)*angl_o);
NEFD[n-1][1]:=-EFD[n-1][0]*sin((n)*angl_o) + EFD[n-1][1]*cos((n)*angl_o);
NEFD[n-1][2]:= EFD[n-1][2]*cos((n)*angl_o) + EFD[n-1][3]*sin((n)*angl_o);
NEFD[n-1][3]:=-EFD[n-1][3]*sin((n)*angl_o) + EFD[n-1][3]*cos((n)*angl_o);
end;
// make the semi-major axis parallel to the x-axis
angl_w := ArcTan( NEFD[1][2] / NEFD[1][0] );
cs := cos(angl_w);
ss := sin(angl_w);
for n:=1 to m_num_efd do begin
NEFD[n][0] := cs*NEFD[n][0] + ss*NEFD[n][2];
NEFD[n][1] := cs*NEFD[n][1] + ss*NEFD[n][3];
NEFD[n][2] :=-ss*NEFD[n][0] + cs*NEFD[n][2];
NEFD[n][3] :=-ss*NEFD[n][1] + cs*NEFD[n][3];
end;
// size invariant
R := sqrt( NEFD[1][0]*NEFD[1][0] );
for n:=0 to m_num_efd do begin
NEFD[n][0] := NEFD[n][0] / R;
NEFD[n][1] := NEFD[n][1] / R;
NEFD[n][2] := NEFD[n][2] / R;
NEFD[n][3] := NEFD[n][3] / R;
end;
当我尝试使半长轴平行于 X 并旋转系数时,我得到了一个丑陋的结果。看起来恢复后的形状是围绕 z 轴旋转的。 (左侧为源形状,右侧为还原形状。)
我的代码有什么问题?
更新
@MBo 成功回答后,需要对代码进行以下修改:
// MODIFIED: change n-1 to n
// rotate starting point
angl_o := 0.5 * ArcTan2( 2*(An*Bn + Cn*Dn), An*An + Cn*Cn - Bn*Bn - Dn*Dn );
for n:=1 to m_num_efd+1 do begin
NEFD[n][0]:= EFD[n][0]*cos((n)*angl_o) + EFD[n][1]*sin((n)*angl_o);
NEFD[n][1]:=-EFD[n][0]*sin((n)*angl_o) + EFD[n][1]*cos((n)*angl_o);
NEFD[n][2]:= EFD[n][2]*cos((n)*angl_o) + EFD[n][3]*sin((n)*angl_o);
NEFD[n][3]:=-EFD[n][3]*sin((n)*angl_o) + EFD[n][3]*cos((n)*angl_o);
end;
// MODIFIED: change left NEFD to EFD
// make the semi-major axis parallel to the x-axis
angl_w := ArcTan( NEFD[1][2] / NEFD[1][0] );
cs := cos(angl_w);
ss := sin(angl_w);
for n:=1 to m_num_efd do begin
EFD[n][0] := cs*NEFD[n][0] + ss*NEFD[n][2];
EFD[n][1] := cs*NEFD[n][1] + ss*NEFD[n][3];
EFD[n][2] :=-ss*NEFD[n][0] + cs*NEFD[n][2];
EFD[n][3] :=-ss*NEFD[n][1] + cs*NEFD[n][3];
end;
// ADDED: place normalized EFD into NEFD
for n:=0 to m_num_efd do begin
NEFD[n][0] := EFD[n][0];
NEFD[n][1] := EFD[n][1];
NEFD[n][2] := EFD[n][2];
NEFD[n][3] := EFD[n][3];
end;
最佳答案
可能原因:
在此循环中,您使用NEFD[n][0]
的修改 值来计算NEFD[n][2]
的新值( NEFD[n][1]
相同)。看来您必须存储和使用未修改的值。
for n:=1 to m_num_efd do begin
NEFD[n][0] := cs*NEFD[n][0] + ss*NEFD[n][2];
NEFD[n][1] := cs*NEFD[n][1] + ss*NEFD[n][3];
vvvvvvvvv
NEFD[n][2] :=-ss*NEFD[n][0] + cs*NEFD[n][2];
vvvvvvvvv
NEFD[n][3] :=-ss*NEFD[n][1] + cs*NEFD[n][3];
end;
关于algorithm - 如何归一化椭圆傅里叶系数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36710928/
我已经训练了一个线性回归模型来以多输出方式进行预测。这是一个时间序列预测问题,根据一组输入来估计 future 12 个月的需求。在过去 - 如果我只预测一个输出值 - 我会简单地调用以下命令来访问模
我的应用程序对原始音频信号执行FFT(所有麦克风读数均为values中的16位整数值,即1024个单元)。它首先根据16位对读数进行归一化。然后提取频率为400Hz的幅度。 int sample_ra
我从包含相同语音内容的两个大约 30 秒的音频文件中提取了两个系列 MFCC 系数。音频文件从不同来源录制在同一位置。应该估计音频是否包含相同的对话或不同的对话。目前我已经测试了两个Mfcc系列的相关
我正在尝试使用两个自变量(批处理和方法)和一个因变量 (conc) 运行线性回归。当我运行回归时,我得到一个系数的 NA 值。当我更改模型中自变量的顺序时,NA 值显示为不同的变量。这是一个可重现的数
我想要的,大图:我想知道如何在 Java 中模仿 Mathematica 的 ExtendedGCD[...] 功能。有关该功能的信息可以在 here 中找到,但为了完整起见,我将对其进行简要描述。
我用 R 编写了这个套索代码,并且得到了一些 beta 值: #Lasso library(MASS) library(glmnet) Boston=na.omit(Boston) x=model.m
我有一个幅频响应点列表。振幅以分贝为单位给出。 任务是将此 AFR 列表导出为某些硬件 DSP 设备的一组系数。我知道此设备的文件格式。该设备的规范表明它需要 12288 个系数,并且 DSP 有 2
是否可以替换 lm 对象中的系数? 我认为以下会起作用 # sample data set.seed(2157010) x1 <- 1998:2011 x2 <- x1 + rnorm(length(
我正在尝试使用 lm.ridge 方法执行岭回归。我的问题是如何获得拟合模型的系数?我从调用中得到不同的结果: 模型$coef 系数(模型) 哪个是正确的?另外,为什么我从调用中得到不同的结果: co
以下代码片段死于 Eigen 断言: MatrixXd L; VectorXd x, b; ... ASSERT_MATRIX_EQ(L*x, b); 与, template void ASSERT
有没有办法从编码的图像和视频中轻松提取 DCT 系数(和量化参数)?任何解码器软件都必须使用它们来解码 block DCT 编码的图像和视频。所以我很确定解码器知道它们是什么。有没有办法将它们暴露给使
如何找到矢量 w 是多少,即垂直于分离平面? 最佳答案 我就是这样做的here .如果我没记错的话,这是基于 dual form 的SVM 优化的结果。 model = svmtrain(...);
我是 FFMPEG 的新手。我知道如何提取关键帧, 但现在我想提取那些 I 帧的 DC 系数。 您能否帮助编写 FFMPEG 命令的正确语法以获取 DC 系数? 问候 最佳答案 FFmpeg 命令不会
任何人都可以共享任何代码或可调用以从 HEVC 比特流中提取变换系数 (DCT/DST) 的函数吗? 我检查了 HM 16.0 的源代码。文件\source\Lib\TLibCommon\TComTr
我需要从 MPEG4 视频中提取有关运动矢量和 DC 系数的信息。我搜索了相关站点和主题,发现一个好的解决方案是使用 ffmpeg 编解码器的代码。尤其是 libavcodec/mpegvideo.c
我想删除sympy符号表达式中等于1的任何系数,例如:我希望 1.0x**2 成为 x**2 ,有办法做到吗?另外,如果可能的话,可以对整数进行舍入,例如将 2.0x**2 变为 2*x**2 最佳答
我想删除sympy符号表达式中等于1的任何系数,例如:我希望 1.0x**2 成为 x**2 ,有办法做到吗?另外,如果可能的话,可以对整数进行舍入,例如将 2.0x**2 变为 2*x**2 最佳答
我最近的任务是将 PMML 解析回 R 模型。 (我进行了广泛搜索,没有库可以为您进行这种转换。)我正在尝试将包含多项逻辑回归的 PMML 转换回 R 模型,但我不知道如何转换任何PMML 文档中保存
当使用 pandas statsmodels 的 .summary() 函数时,OLS 回归结果包括以下字段。 coef std err t P>|t| [
我正在 STM32F4 微 Controller 上使用 CMSIS 库开发 PID Controller 。我实在无法理解PID参数的归一化。现在我有了 PID Controller 的三个 Kp、
我是一名优秀的程序员,十分优秀!