Re[2]: распараллеливание и ресурсоёмкость
От: vvv848165@ya.ru  
Дата: 16.04.19 11:08
Оценка:
Здравствуйте, 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;
            }
        }
    }
Отредактировано 16.04.2019 12:07 vvv848165@ya.ru . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.