【发布时间】:2012-10-11 10:59:47
【问题描述】:
我在插入数据文件时遇到问题,我已将其从 .csv 转换为 X 数组和 Y 数组,其中 X[0] 对应于点 Y[0]。
我需要在这些值之间进行插值,以在最后给我一个平滑的文件。 我正在使用 Picoscope 来输出函数,这意味着每行在时间上是等距的,所以只使用 Y 值,这就是为什么当你看到我的代码时我试图以一种奇怪的方式来做这件事。
它必须处理的值类型是:
X Y
0 0
2.5 0
2.5 12000
7.5 12000
7.5 3000
10 3000
10 6000
11 6625.254
12 7095.154
因此,如果 2 个 Y 值彼此相邻,则它们之间是一条直线,但是当它们从 X = 10 开始变化时,在本例中它变成了正弦波。
我一直在看这里的插值等式和其他帖子,但我已经多年没有做过那种数学了,遗憾的是我再也想不通了,因为有 2 个未知数,我可以'不考虑如何将其编程到 c# 中。
我拥有的是:
int a = 0, d = 0, q = 0;
bool up = false;
double times = 0, change = 0, points = 0, pointchange = 0;
double[] newy = new double[8192];
while (a < sizeoffile-1 && d < 8192)
{
Console.Write("...");
if (Y[a] == Y[a+1])//if the 2 values are the same add correct number of lines in to make it last the correct time
{
times = (X[a] - X[a + 1]);//number of repetitions
if ((X[a + 1] - X[a]) > times)//if that was a negative number try the other way around
times = (X[a + 1] - X[a]);//number of repetitions
do
{
newy[d] = Y[a];//add the values to the newy array which replaces y later on in the program
d++;//increment newy position
q++;//reduce number of reps in this loop
}
while (q < times + 1 && d < 8192);
q = 0;//reset reps
}
else if (Y[a] != Y[a + 1])//if the 2 values are not the same interpolate between them
{
change = (Y[a] - Y[a + 1]);//work out difference between the values
up = true;//the waveform is increasing
if ((Y[a + 1] - Y[a]) > change)//if that number was a negative try the other way around
{
change = (Y[a + 1] - Y[a]);//work out difference bwteen values
up = false;//the waveform is decreasing
}
points = (X[a] - X[a + 1]);//work out amount of time between given points
if ((X[a + 1] - X[a]) > points)//if that was a negative try other way around
points = (X[a + 1] - X[a]);///work out amount of time between given points
pointchange = (change / points);//calculate the amount per point in time the value changes by
if (points > 1)//any lower and the values cause errors
{
newy[d] = Y[a];//load first point
d++;
do
{
if (up == true)//
newy[d] = ((newy[d - 1]) + pointchange);
else if (up == false)
newy[d] = ((newy[d - 1]) - pointchange);
d++;
q++;
}
while (q < points + 1 && d < 8192);
q = 0;
}
else if (points != 0 && points > 0)
{
newy[d] = Y[a];//load first point
d++;
}
}
a++;
}
这会创建一个接近的波形,但它仍然非常阶梯状。
那么任何人都可以看出为什么这不是很准确吗? 如何提高其准确性? 或者使用数组的不同方式?
感谢收看 :)
【问题讨论】:
-
Least Squares C# library 的可能重复项
标签: c# interpolation