Почему не строится график из семплов в C#?
Пытаюсь перевести код с DELPHI на C#, суть программы в построении спектра из семплов. Оригинальный код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, ExtCtrls, TeeProcs, Chart, Series;
type
TForm1 = class(TForm)
Chart1: TChart;
GroupBox1: TGroupBox;
filename_label: TLabel;
num_samples_label: TLabel;
Edit2: TEdit;
num_errors_label: TLabel;
Edit3: TEdit;
Button1: TButton;
Edit4: TEdit;
progress_label: TLabel;
OpenDialog1: TOpenDialog;
Series1: TFastLineSeries;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
g_Pi2=Pi*2;
var
Form1: TForm1;
YDPFa : array [1..15000000] of Double; // про динамические массивы - не слышали, видимо
g_F: text; // file handle;
implementation
{$R *.dfm}
Function DPF(NN :integer; OMGDPF :Single): Single;
(*
NN - количество семплов из файла
*)
var x1, y1, y2, Mi : Single;
Alpha, k, Ni, Li : integer;
A1, A2 : Double;
T: Double;
begin
A1:=0;
A2:=0;
T:=1/44000;
y1:=g_Pi2/(NN*T); { Минимальная частота ДПФ }
y2:=Pi/T; { Максимальная частота ДПФ }
{ y1>1 период текущей частоты OMGDPF меньше периода оценивания }
if (NN=0) or (y2<OMGDPF) or (y1=OMGDPF) then
begin
DPF:=0;
Li:=0;
Mi:=0;
A1:=0;
A2:=0;
end
else
if OMGDPF<y1 then
begin
Li:=0;
Mi:=NN;
For k:=1 to NN do A1:=A1+YDPFa[k];
A1:=A1/NN;
result:= ABS(A1);
A2:=0;
end
else
begin
Mi:=g_Pi2/(T*OMGDPF); { Число тактов в периоде текущей частоты }
Li:=Trunc(NN/Mi); { число целых периодов текущей частоты в NN измерений }
Ni:=Trunc(Li*Mi); { Число тактов ДПФ }
Alpha:=(NN-Ni) Div 2;
if Mi>=2 then
begin
For k:=1+Alpha to Ni+Alpha do
begin
x1:=OMGDPF*T*(k-1-Alpha);
A1:=A1+YDPFa[k]*cos(x1);
A2:=A2+YDPFa[k]*sin(x1);
end;
if Ni>0 then
begin
A1:=A1*2/Ni;
A2:=A2*2/Ni;
end;
result:=Sqrt(SQR(A1)+SQR(A2));
end
else
begin
result:=0;
Li:=NN;
A1:=0;
A2:=0;
end;
end;
end;
procedure Spectr(NN, SCC:integer);
(*
NN - количество семплов из файла
SCC - номер канала чарта
*)
var x1,OmgM,Yv,Times : Single;
n, Num1 : integer;
Fx, Tr, BmR : single;
begin
Num1:=5000;
BmR:=22000*g_Pi2; { Максимальная частота ДПФ }
{ Вывод спектра на график }
Fx:=BmR/NN;
x1:=BmR;
Tr:=(x1-Fx)/Num1;
{ Главный цикл }
For n:=0 to Num1 do
begin
OmgM:=Fx+Tr*n;
{ Вычисление текущего значения cпектра }
Yv :=DPF(NN, OmgM);
{ Вывод результатлов на дисплей }
Times:=OmgM/g_Pi2;
form1.Chart1.series[SCC].addXY(Times,Yv);
if n mod 100=0 then
begin
form1.progress_label.Caption:=form1.progress_label.Caption+'.';
form1.Refresh;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var ttt,Line:ShortString;
i,j,k,m,n:integer;
x:single;
ADF : array [0..255] of Char; // messagebox string buffer
begin
if form1.OpenDialog1.Execute then
begin
ttt:=form1.OpenDialog1.FileName;
form1.edit2.Text:=ttt;
AssignFile(g_F,ttt);
{$I-}
Reset(g_F);
{$I+}
if IoResult<>0 then
begin
StrPCopy(ADF, 'Файл с именем '+form1.OpenDialog1.FileName+' открыть невозможно!!!');
Application.MessageBox(ADF,'Ошибка чтения файла',0);
exit;
end;
j:=0;
n:=0;
while not Eof(g_F) do
begin
j:=j+1;
Readln(g_F, Line);
for k:=1 to ORD(Line[0]) do if Line[k]=',' then Line[k]:='.'; // зпт на тчк
val(Line,x,m);
if m<>0 then // on error
begin
x:=0;
n:=n+1;
end;
YDPFa[j]:=x; // семплы из файла
end;
CloseFile(g_F);
form1.edit3.Text:=IntToStr(j);
form1.edit4.Text:=IntToStr(n);
if j<10 then exit;
form1.progress_label.Caption:='';
form1.Chart1.Title.Text.Clear;
for i:=0 to Chart1.SeriesList.Count-1 do
begin
{ Очистка графиков, отключение легенд }
form1.Chart1.Series[i].Clear;
form1.Chart1.Series[i].ShowInLegend:=false;
end;
Spectr(j,0);
end;
end;
end.
Мой код на C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Udar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const double g_Pi2 = Math.PI * 2;
List<double> YDPFa = new List<double>();
public double DPF(int NN, double OMGDPF)
{
double resultDPF;
double x1, y1, y2, Mi, T, A1, A2;
int Alpha, Ni, Li;
resultDPF = 0;
A1 = 0;
A2 = 0;
T = 1 / 44000;
y1 = g_Pi2 / (NN * T); /* Минимальная частота ДПФ */
y2 = Math.PI / T; /* Максимальная частота ДПФ */
/* y1 > 1 период текущей частоты OMGDPF меньше периода оценивания */
if ((NN == 0) | (y2 < OMGDPF) | (y1 == OMGDPF))
{
Li = 0;
Mi = 0;
A1 = 0;
A2 = 0;
}
else if (OMGDPF < y1)
{
Li = 0;
Mi = NN;
for (int k = 1; k<NN; k++)
{
A1 = A1 + YDPFa[k];
}
A1 = A1 / NN;
resultDPF = Math.Abs(A1);
A2 = 0;
}
else
{
Mi = g_Pi2 / (T * OMGDPF); //Число тактов в периоде текущей частоты
Li = (int)Math.Truncate(NN/Mi); //Число целых периодов текущей частоты в NN измерений
Ni = (int)Math.Truncate(Li * Mi); //Число тактов ДПФ
Alpha = (NN - Ni) % 2;
if (Mi>=2)
{
for (int k=1+Alpha; k<Ni+Alpha; k++)
{
x1 = OMGDPF * T * (k - 1 - Alpha);
A1 = A1 + YDPFa[k] * Math.Cos(x1);
A2 = A2 + YDPFa[k] * Math.Sin(x1);
}
if (Ni > 0)
{
A1 = A1 * 2 / Ni;
A2 = A2 * 2 / Ni;
resultDPF = Math.Sqrt((A1 * A1) + (A2 * A2));
}
else
{
resultDPF = 0;
Li = NN;
A1 = 0;
A2 = 0;
}
}
}
return resultDPF;
}
public void Spectr(int NN, int SCC)
{
double x1, OmgM, Yv, Times;
int Num1;
double Fx, Tr, BmR;
Num1 = 5000;
BmR = 22000 * g_Pi2;
/* Вывод спектра на график */
Fx = BmR / NN;
x1 = BmR;
Tr = (x1 - Fx) / Num1;
/* Главный цикл */
for (int n = 0; n<Num1; n++)
{
OmgM = Fx + Tr * n;
//Вычисление текущего значения cпектра
Yv = DPF(NN, OmgM);
//Вывод результатлов на дисплей
Times = OmgM / g_Pi2;
chart1.Series[SCC].Points.AddXY(Times, Yv);
if (n % 100 == 0)
{
//form1.Label2.Caption:= form1.Label2.Caption + '.';
}
}
}
private void textBox1_Click(object sender, EventArgs e)
{
string FilePath = string.Empty;
OpenFileDialog OPF = new OpenFileDialog();
OPF.Filter = "Файлы txt|*.txt";
if (OPF.ShowDialog() == DialogResult.OK)
{
FilePath = OPF.FileName;
textBox1.Text = FilePath;
}
YDPFa = File.ReadAllLines(FilePath)
.SelectMany(l => l.Split('\n').Select(double.Parse))
.ToList();
Spectr(YDPFa.Count, 0); //Измерений, № графика, № исх.данн., № колонки.Вых.данн. 3 и 4
}
}
}
Помогите пожалуйста найти проблему
Содержимое файла с семплами
-1,00091
1,00091
-1,00091
-2,00091
-3,00070
-1,00073
1,00082
-2,00067
-2,00085
-1,00091
-1,00088
-2,00137
-1,00097
-1,00109
Результат исполнения кода на C#

