Сообщение Re[2]: распараллеливание и ресурсоёмкость от 16.04.2019 11:08
Изменено 16.04.2019 12:07 vvv848165@ya.ru
Re[2]: распараллеливание и ресурсоёмкость
Здравствуйте, Sinclair, Вы писали:
S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].
ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192
public void Init(string[] names)
{
no_channel = names.Length;
fs = new FilterSections[no_channel];
gain = new double[no_channel];
for (int i = 0; i < no_channel; i++)
{
fs[i] = new FilterSections();
gain[i] = 1.0d;
Coeff coeff = FilterCoefficient.GetCoefficients(names[i]);
fs[i].Init(coeff);
}
}
class FilterSections
{
private Filter[] filters = null;
private int no_filtres = 0;
public FilterSections()
{
}
public void Init(Coeff coef)
{
no_filtres=coef.no_filtres;
filters = new Filter[no_filtres];
for (int i = 0; i < no_filtres; i++)
filters[i] = new Filter();
for (int i = 0; i < no_filtres; i++)
filters[i].Init(coef.pre_gain[i], coef.DEN[i * 2 + 0], coef.DEN[i * 2 + 1],coef.NUM[i]);
}
public void Next(ref double[] y, double[] x)
{
int no=x.Length;
double[] val = new double[no];
for (int j = 0; j < no; j++)
val[j] = x[j];
for (int i = 0; i < no_filtres; i++)
filters[i].Next(ref val, val);
for (int j = 0; j < no; j++)
y[j] = val[j];
/*
int no_filtres_m_1 = no_filtres — 1;
filters[0].Next(ref val, x);
for (int i = 1; i < no_filtres_m_1; i++)
filters[i].Next(ref val, val);
filters[no_filtres_m_1].Next(ref y, val);
*/
}
}
public class Filter
{
private double v1 = 0.0d, v2 = 0.0d;
private double pregain, a2, a3, b2;
public Filter()
{
}
public void Init(double _pregain, double _a2, double _a3, double _b2)
{
pregain = _pregain; a2 = _a2; a3 = _a3; b2 = _b2;
}
public void Next(ref double[] y, double[] x)
{
for (long i = 0; i < x.LongLength; i++)
{
double v0 = pregain * x[i] — a2 * v1 — a3 * v2;
y[i] = v0 + b2 * v1 + v2;
v2 = v1; v1 = v0;
}
}
}
S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].
ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192
public void Init(string[] names)
{
no_channel = names.Length;
fs = new FilterSections[no_channel];
gain = new double[no_channel];
for (int i = 0; i < no_channel; i++)
{
fs[i] = new FilterSections();
gain[i] = 1.0d;
Coeff coeff = FilterCoefficient.GetCoefficients(names[i]);
fs[i].Init(coeff);
}
}
class FilterSections
{
private Filter[] filters = null;
private int no_filtres = 0;
public FilterSections()
{
}
public void Init(Coeff coef)
{
no_filtres=coef.no_filtres;
filters = new Filter[no_filtres];
for (int i = 0; i < no_filtres; i++)
filters[i] = new Filter();
for (int i = 0; i < no_filtres; i++)
filters[i].Init(coef.pre_gain[i], coef.DEN[i * 2 + 0], coef.DEN[i * 2 + 1],coef.NUM[i]);
}
public void Next(ref double[] y, double[] x)
{
int no=x.Length;
double[] val = new double[no];
for (int j = 0; j < no; j++)
val[j] = x[j];
for (int i = 0; i < no_filtres; i++)
filters[i].Next(ref val, val);
for (int j = 0; j < no; j++)
y[j] = val[j];
/*
int no_filtres_m_1 = no_filtres — 1;
filters[0].Next(ref val, x);
for (int i = 1; i < no_filtres_m_1; i++)
filters[i].Next(ref val, val);
filters[no_filtres_m_1].Next(ref y, val);
*/
}
}
public class Filter
{
private double v1 = 0.0d, v2 = 0.0d;
private double pregain, a2, a3, b2;
public Filter()
{
}
public void Init(double _pregain, double _a2, double _a3, double _b2)
{
pregain = _pregain; a2 = _a2; a3 = _a3; b2 = _b2;
}
public void Next(ref double[] y, double[] x)
{
for (long i = 0; i < x.LongLength; i++)
{
double v0 = pregain * x[i] — a2 * v1 — a3 * v2;
y[i] = v0 + b2 * v1 + v2;
v2 = v1; v1 = v0;
}
}
}
Re[2]: распараллеливание и ресурсоёмкость
Здравствуйте, Sinclair, Вы писали:
S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].
ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192
S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].
ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192
public void Init(string[] names)
{
no_channel = names.Length;
fs = new FilterSections[no_channel];
gain = new double[no_channel];
for (int i = 0; i < no_channel; i++)
{
fs[i] = new FilterSections();
gain[i] = 1.0d;
Coeff coeff = FilterCoefficient.GetCoefficients(names[i]);
fs[i].Init(coeff);
}
}
class FilterSections
{
private Filter[] filters = null;
private int no_filtres = 0;
public FilterSections()
{
}
public void Init(Coeff coef)
{
no_filtres=coef.no_filtres;
filters = new Filter[no_filtres];
for (int i = 0; i < no_filtres; i++)
filters[i] = new Filter();
for (int i = 0; i < no_filtres; i++)
filters[i].Init(coef.pre_gain[i], coef.DEN[i * 2 + 0], coef.DEN[i * 2 + 1],coef.NUM[i]);
}
public void Next(ref double[] y, double[] x)
{
int no=x.Length;
double[] val = new double[no];
for (int j = 0; j < no; j++)
val[j] = x[j];
for (int i = 0; i < no_filtres; i++)
filters[i].Next(ref val, val);
for (int j = 0; j < no; j++)
y[j] = val[j];
/*
int no_filtres_m_1 = no_filtres - 1;
filters[0].Next(ref val, x);
for (int i = 1; i < no_filtres_m_1; i++)
filters[i].Next(ref val, val);
filters[no_filtres_m_1].Next(ref y, val);
*/
}
}
public class Filter
{
private double v1 = 0.0d, v2 = 0.0d;
private double pregain, a2, a3, b2;
public Filter()
{
}
public void Init(double _pregain, double _a2, double _a3, double _b2)
{
pregain = _pregain; a2 = _a2; a3 = _a3; b2 = _b2;
}
public void Next(ref double[] y, double[] x)
{
for (long i = 0; i < x.LongLength; i++)
{
double v0 = pregain * x[i] - a2 * v1 - a3 * v2;
y[i] = v0 + b2 * v1 + v2;
v2 = v1; v1 = v0;
}
}
}