Дискретное преобразование Хартли

Воспользовался преобразованием Хартли для функции cos(x).

Далее возникает вопрос в его проверки. Думал проверить с помощью стандартного преобразования Фурье т.е. взять
enter image description here
за место f(x) подставить sin(x), проинтегрировать и построить график получившегося. Однако полученые графики не сходятся.

List<double> lk=new List<double>();
 int d = ct;

 chart2.Series[0].Points.Clear();
 chart2.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;

 for (int i = 0; i < d; i++)
 {
     for (int j = 0; j < d; j++)
     {
         max += hk[j] * (Math.Cos(2 * Math.PI * j * i / ct) + Math.Sin(2 * Math.PI * j * i / ct));
     }
     double Hk= max / d;
     lk.Add(Hk);
     chart2.Series[0].Points.AddXY(i, Hk);
     max = 0;
 }
     
 return (1);
 

Возникает вопрос ошибка в коде? Или данные метод не подходит для проверки?


Ответы (1 шт):

Автор решения: user23981779

Массив исходных данных hk[j]=ocs(x). Нашел проблему. В исходном массиве было слишком мало точек. Тут при отрисовке применялся сплайн, который прятал реальные точки. После расширения количества начальных точек, алгоритм работает. Проверить можно с помощью MathNet библиотеки там есть

double[] led =Hartley.NaiveForward(l,H); 

где l - массив точек входных H -

HartleyOptions H = HartleyOptions.Default;

которые позволяет реализует быстрый алгоритм Харли, потом сопоставить результаты со своими.

Так же при ходе первого цикл - должен идти не по единице а по ходу самих исходных точек в h[k].

for (int i = 0; i < d; i++)

Тут должно быть не i++, а сумматор с которым были прописаны точки

→ Ссылка