Шустрый

Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006
Репутация: нет Всего: нет
|
Все привет. Есть библиотека, а в ней есть такой класс: Код | public class Complex { public double Re = 0.0; public double Im = 0.0;
public Complex() { } public Complex(double re, double im){ Re = re; Im = im; } }
|
Теперь пытаюсь тестить: Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using MC_FFT_parallel;
namespace test_new_par { class Program { static void Main(string[] args) { int n=(int)Math.Pow(2,2); Complex[] arr1 = new Complex[n]; Complex[] arr2 = new Complex[n]; Random r = new Random(); Console.WriteLine("Re Im"); // печатает нормально for (int i = 0; i < n; i++) { arr1[i] = new Complex(r.NextDouble()*10,r.NextDouble()*10); arr2[i] = new Complex(); Console.WriteLine(arr1[i].Re + " " + arr1[i].Im);
} FFT_parallel fft_p = new FFT_parallel();
int n1 = 0; int n2 = 0; int np = 1;
// тут выскакивает NullReferenceException arr2 = fft_p.FFT(arr1, n1, n2, np);
Console.ReadKey(); } } }
|
Есть идеи, почему выскакивает Exceprion? Вот код dllки: Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using MCSharp;
namespace MC_FFT_parallel { public class FFT_parallel { public handler Wait void ()& channel Ready(){return ;} // Cooley-Tukey Algorithm
public Complex[] FFT(Complex[] X, int n1, int n2, int np) { int n = X.Length; Complex[] Y = new Complex[n]; Complex[] P = new Complex[n]; Complex[] T = new Complex[n];
for (int k = 0; k < np; k++) Column_Iterative_Serial_FFT(X, Y, k * n2*n1/np, n1,n2,np); for (int k = 0; k < np; k++) Wait?();
for (int i = 0; i < np; i++) Row_Iterative_Serial_FFT(Y, P, T, i * n1*n2/np, n1,n2,np); for (int i = 0; i < np; i++) Wait?();
return T; }
public async Column_Iterative_Serial_FFT(Complex[] a, Complex[] A, int start, int n1, int n2,int np) { int block_len=n1/np; for (int k = 0; k < block_len; k++) Column_Iterative_FFT(a, A, start+k * n2, n1, n2);
//Column Twiddle Factor Multiplication
int x,y; //x,y - indexes of column and row of transpose matrix accordingly double wn_Re=0,arg = 0,wn_Im=0,tmp=0; int ks,t=0,j=0,i=0; for (int q = 0; q < n2*block_len; q++) { j = (int)Math.Ceiling((double)(q + 1) / n2) - 1; i = q - ((q) / n2) * n2; t =start+j * n2+i;
split_idx(t,n2,n1,out x, out y); arg = 2 * Math.PI * x * y / (n2 * n1); wn_Re = Math.Cos(arg); wn_Im = Math.Sin(arg);
ks=t/n2+n1*(t-n2*(t/n2));
tmp = A[ks].Re * wn_Re - A[ks].Im * wn_Im; A[ks].Im = A[ks].Re * wn_Im + A[ks].Im * wn_Re; A[ks].Re = tmp; } Ready ! (); }
public async Row_Iterative_Serial_FFT(Complex[] a, Complex[] A, Complex[] T,int start, int n1,int n2,int np) { for (int i = 0; i < n2/np; i++) { Row_Iterative_FFT(a, A, start+i * n1, n1);
//Sort elements in right order to create output vector
for(int q=0;q<n1;q++) T[TL_idx(start+i * n1+q,n1,n2)]=A[start+i * n1+q]; } Ready ! (); } //Translate index i of untransposed vector to linearized index of transposed vector int TL_idx(int i, int raw_len, int col_len) { int raw_i = i / (raw_len); return ( raw_i + (i - raw_i * raw_len) * col_len ); }
//index delinearization void split_idx(int i,int raw_len, int col_len, out int x, out int y) { y = i / (raw_len); x=i - y * raw_len; }
public void Column_Iterative_FFT(Complex[] a, Complex[] A, int start, int n1, int n2) { int j, k, m, m2, km2,ktemp, s; double wn_Re, wn_Im, w_Re, w_Im; double arg, t_Re, t_Im; double u_Re, u_Im, tmp;
int logN = 0; m = n2;
while( m > 1 ) { m = m / 2; logN++; }
int iTbcr=0; int ibcr=0; int temp; for (k = 0; k < n2; k++) { temp=bit_reverse(k, logN); iTbcr=(temp + start) / n2 + n1*(temp + start - ((temp + start)/ n2) * n2); ibcr=(k + start) / n2 + n1*(k + start - ((k + start)/ n2) * n2); A[iTbcr]=a[ibcr]; }
for ( s = 1; s <= logN; s++ ) { m = 1 << s;
arg = 2.0 * Math.PI / m;
wn_Re = Math.Cos ( arg ); wn_Im = Math.Sin ( arg );
w_Re = 1.0;w_Im = 0.0;
m2 = m >> 1; for ( j = 0; j < m2; j++ ) { for ( k = j; k < n2; k += m ) { km2=(k + m2 + start)/n2 + n1*(k + m2 + start - ((k + m2 + start)/ n2) * n2); ktemp=(k + start)/n2 + n1*(k + start - ((k + start)/ n2) * n2);
t_Re = w_Re * A [ km2 ].Re - w_Im * A [ km2 ].Im; t_Im = w_Re * A [ km2 ].Im + w_Im * A [ km2 ].Re;
u_Re = A[ktemp].Re; u_Im = A[ktemp].Im;
A[ktemp].Re = u_Re + t_Re; A[ktemp].Im = u_Im + t_Im;
A [km2 ].Re = u_Re - t_Re; A [ km2].Im = u_Im - t_Im; } tmp = w_Re * wn_Re - w_Im * wn_Im; w_Im = w_Re * wn_Im + w_Im * wn_Re; w_Re = tmp; }
}
}
public void Row_Iterative_FFT(Complex[] a, Complex[] A, int start, int n1) { int j, k, m, m2, km2, s; double wn_Re, wn_Im, w_Re, w_Im; double arg, t_Re, t_Im; double u_Re, u_Im, tmp;
int logN = 0; m = n1; while( m > 1 ) { m = m / 2; logN++; }
for ( k = 0; k < n1; k++ ) A[bit_reverse(k, logN) + start] = a[k + start];
for ( s = 1; s <= logN; s++ ) { m = 1 << s;
arg = 2.0 * Math.PI / m;
wn_Re = Math.Cos ( arg ); wn_Im = Math.Sin ( arg );
w_Re = 1.0;w_Im = 0.0;
m2 = m >> 1; for ( j = 0; j < m2; j++ ) { for ( k = j; k < n1; k += m ) { km2 = k + m2+start;
t_Re = w_Re * A[ km2 ].Re - w_Im * A[ km2 ].Im; t_Im = w_Re * A[ km2 ].Im + w_Im * A[ km2 ].Re;
u_Re = A[k + start].Re; u_Im = A[k + start].Im;
A[k + start].Re = u_Re + t_Re; A[k + start].Im = u_Im + t_Im;
A[ km2 ].Re = u_Re - t_Re; A[ km2 ].Im = u_Im - t_Im; }
tmp = w_Re * wn_Re - w_Im * wn_Im; w_Im = w_Re * wn_Im + w_Im * wn_Re; w_Re = tmp; } } }
public int bit_reverse(int k, int size) { int right_unit = 1; int left_unit = 1 << (size - 1);
int result = 0, bit;
for (int i = 0; i < size; i++) { bit = k & right_unit; if (bit != 0) result = result | left_unit; right_unit = right_unit << 1; left_unit = left_unit >> 1; } return (result); }
public static string Usage() { StringBuilder s = new StringBuilder(); for (int i = 0; i < Console.WindowWidth; i++) s.Append("-"); return ( s.ToString() + Environment.NewLine + "Usage: pFFT.exe p n1 np" + Environment.NewLine + "where" + Environment.NewLine + " p - n=2^p - input vector length" + Environment.NewLine + " n1 - width of block" + Environment.NewLine + " np - number of processes" + Environment.NewLine + s.ToString() + Environment.NewLine ); }
}
public class Complex { public double Re = 0.0; public double Im = 0.0;
public Complex() { } public Complex(double re, double im) { Re = re; Im = im; }
}
}
|
|