7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
1

FIR and spectrum tools

30.06.2018, 01:01. Показов 1732. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
afrtohtcoefs -program for converting AFR coeffs to h(t) coeffs for FIR

Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// afrtohtcoefs.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
 #include <iostream>
#include <stdlib.h>
#include <cmath>
 
#define M_PI 3.1415926535897932384626433832795
//int _tmain(int argc, _TCHAR* argv[])
//{
// return 0;
//}
 
 //afrtohtcoefs.cpp
 
 
#define  NMAX 512
FILE *fp, *fp1; 
 
int k,n;
int w,t,N;
double h[NMAX];
double h_im[NMAX];
double Re_H[NMAX];
double Im_H[NMAX];
double Re_x[NMAX];
double Im_x[NMAX];
double abs_H[NMAX];
double arg_H[NMAX];
double f[NMAX];
float angle;
double   K, fs,T,finp,Tmax;
char str;
char key;
 
/*
float heavi( double t) 
{
if (t<0 ) return 0;
if (t>=0) return 1;
}
 
float heavi1( int n) 
{
if (n<0 ) return 0;
if (n>=0) return 1;
}*/
 
double getarg(float Re_H,float Im_H)
{
 
return atan2(Im_H,Re_H) * 180 / M_PI;
}
 
 
 int _tmain(int argc, _TCHAR* argv[])
{
 
 
printf ("\n For input  |H(jw)|, fi(w) from file input '1' ");
printf ("\n For manual  input |H(jw)|, fi(w) input   '0' ");
 
//std::cin>>key;
scanf( "%s", &key);
if (key=='0' ) { goto label_02;}
if (key=='1' ) { goto label_01;}
 
label_01:
 printf("\n Open afrcoefs.txt for reading AFR coefficients ");
if ((fp=fopen("afrcoefs.txt","r"))==NULL)  printf ("\n File opening error");
fscanf(fp,"%le",&fs);
fscanf(fp,"%d",&N);
Tmax=N*1/fs;
for (k=0 ; k<N;k++)
{ 
// f[k]=k*fs/N;
//fprintf(fp1,"\n n=%d |H(jw)|= %lf ; arg(H(jw))= %lf; f=%lf Hz",k, abs_H[k] ,arg_h[k], f[k]) ; 
 fscanf (fp,"%d",&n);
 fscanf (fp,"%le",&abs_H[k]);
 fscanf (fp,"%le",&arg_H[k]);
 
  fscanf (fp,"%le",&f[k]);
 
 arg_H[k]=arg_H[k]*M_PI/180; 
}
fclose(fp);
goto label_03;
 
label_02:
 
printf("\n Input fs ,Hz ");
scanf("%le",&fs);
printf(" Input  number of points ");
scanf("%d",&N);
Tmax=N*1/fs;
printf("\n Tmax =%lf s", Tmax);
for (k=0 ; k<N;k++)
{
f[k]=k*fs/N;
 
//fprintf(fp1,"\n n=%d |H(jw)|= %lf ; arg(H(jw))= %lf; f=%lf Hz",k, abs_H[k] ,arg_h[k], f[k]) ; 
      printf("\n F=%le Hz" ,f[k]);
   printf("\n k=%d;    |H(jw)|[k]=",k );
   scanf ( "%le",&abs_H[k]);
      printf(" k=%d;   arg(H(jw))[k]=",k );
      scanf ( "%le",&arg_H[k]);
//abs_H[k]=1;
//arg_H[k]=0;
arg_H[k]=arg_H[k]*M_PI/180; 
}
 
label_03:
 
for (k=0 ; k<N;k++)
{
f[k]=k*fs/N;
printf("\n n=%d;|H(jw)|= %le ;arg(H(jw))= %le deg;f=%lf Hz",k, abs_H[k] ,  arg_H[k]*180/M_PI , f[k]) ; 
 
}
 
 
printf("\n Input 0 for continue ");
scanf("%s",&key);
printf("\n OK. Parsing ...");
 
// H(jw)=integr(0;inf;h(tau)*exp(-j*w*tau) ; d tau)
//K=2*3.1415926/fs;
/*
DFT
X[k]=sum(n=0;N-1; x[n]*exp(-2*pi*j*k*n/N) ), k=0,...,N-1
IDFT
x[n]=(1/N)*sum(k=0;N-1;X[k]*exp(2*pi*k*n/N) ), n=0,...,N-1
100*10^-6*500
*/
 
label1:;
 
//cidft
printf("\n Open hcoefs1.txt for writing coeffs h[n] ");
if ((fp1=fopen("hcoefs1.txt","a"))==NULL)  printf ("\n File opening error");
fprintf(fp1,"\n\n  %le   %d", fs, N );
for (n=0 ; n<N; n++)
{
 Re_x[n]=0;
 Im_x[n]=0;
  for(k=0;k<N;k++)
  {    
   angle=2*M_PI*k*n/N;   
        //Uoutp[w]/Uinp[w]   exp(j( fi out[w]-fi inp[w]) )
   Re_H[k]=abs_H[k]*cos(arg_H[k]);
   Im_H[k]=abs_H[k]*sin(arg_H[k]); 
    Re_x[n] = Re_x[n]+  Re_H[k]*cos(angle)-Im_H[k]*sin(angle);
    Im_x[n] = Im_x[n]+  Re_H[k]*sin(angle) + Im_H[k]*cos(angle);
  }
 Re_x[n]=Re_x[n]/N ;
 Im_x[n]=Im_x[n]/N ;
 // n scaled CIDFT  , not used in this, use if sygnal synth.
 //Re_x[n]=Re_x[n]*N;   
 //Im_x[n]=Im_x[n]*N;   
    //printf("\n n=%d  Re(h(n))=%lf  Im(h(n))=%lf ",n, Re_x[n] ,Im_x[n]  ) ; 
    printf("\n n=%d   h[n]=%lf   ",n, Re_x[n]    ) ;
    fprintf(fp1, "\n  %d   %le   ",n, Re_x[n]  ) ;  
}
 
 fclose (fp1);
 printf( "\n  Re(h(n)=h[n]), use it to load into FIR  "   ) ; 
label3:;
printf("\n Input 0 for exit ");
scanf("%s",&key);
return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// stdafx.cpp : source file that includes just the standard includes
// afrtohtcoefs.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
 
#include "stdafx.h"
 
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
 
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
 
#include <stdio.h>
#include <tchar.h>
 #include <iostream>
#include <stdlib.h>
#include <cmath>
 
// TODO: reference additional headers your program requires here

afrcoefs.txt
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
4.410000e+004  16 
  0   1.000000    0.000000    0.000000  
  1   1.000000    -168.750000    2756.250000  
  2   1.000000    22.500000    5512.500000  
  3   1.000000    -146.249999    8268.750000  
  4   0.000000    45.000005    11025.000000  
  5   0.000000    -123.750001    13781.250000  
  6   0.000000    67.500002    16537.500000  
  7   0.000000    78.750002    19293.750000  
  8   0.000000    90.000002    22050.000000  
  9   0.000000    -78.749998    24806.250000  
  10   0.000000    -67.499999    27562.500000  
  11   0.000000    123.750002    30318.750000  
  12   0.000000    135.000007    33075.000000  
  13   1.000000    146.250002    35831.250000  
  14   1.000000    -22.499997    38587.500000  
  15   1.000000    168.750003    41343.750000  
   4.410000e+004  16 
  0   1.000001e+000    0.000000e+000    0.000000e+000  
  1   1.000000e+000    -1.687500e+002    2.756250e+003  
  2   9.999998e-001    2.250004e+001    5.512500e+003  
  3   1.000000e+000    -1.462500e+002    8.268750e+003  
  4   3.961544e-007    -2.516211e+001    1.102500e+004  
  5   5.013260e-007    5.027288e+001    1.378125e+004  
  6   3.873424e-007    1.400188e+002    1.653750e+004  
  7   4.839081e-007    1.122935e+002    1.929375e+004  
  8   3.130084e-007    1.795795e+002    2.205000e+004  
  9   4.799148e-007    -1.126101e+002    2.480625e+004  
  10   3.857124e-007    -1.408047e+002    2.756250e+004  
  11   4.938736e-007    -5.018234e+001    3.031875e+004  
  12   3.914724e-007    2.715836e+001    3.307500e+004  
  13   1.000000e+000    1.462500e+002    3.583125e+004  
  14   9.999998e-001    -2.250004e+001    3.858750e+004  
  15   1.000000e+000    1.687500e+002    4.134375e+004  
   4.410000e+004  16 
  0   1.000001e+000    0.000000e+000    0.000000e+000  
  1   1.000000e+000    -1.687500e+002    2.756250e+003  
  2   9.999998e-001    2.250004e+001    5.512500e+003  
  3   1.000000e+000    -1.462500e+002    8.268750e+003  
  4   3.949392e-007    -2.565670e+001    1.102500e+004  
  5   4.989970e-007    5.024488e+001    1.378125e+004  
  6   3.867226e-007    1.403127e+002    1.653750e+004  
  7   4.821592e-007    1.124314e+002    1.929375e+004  
  8   3.130000e-007    1.800000e+002    2.205000e+004  
  9   4.821592e-007    -1.124314e+002    2.480625e+004  
  10   3.867226e-007    -1.403127e+002    2.756250e+004  
  11   4.989970e-007    -5.024488e+001    3.031875e+004  
  12   3.949392e-007    2.565670e+001    3.307500e+004  
  13   1.000000e+000    1.462500e+002    3.583125e+004  
  14   9.999998e-001    -2.250004e+001    3.858750e+004  
  15   1.000000e+000    1.687500e+002    4.134375e+004


hcoefs1.txt
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4.410000e+004   16
  0   -4.854692e-002   
  1   3.078799e-002   
  2   6.781642e-002   
  3   -7.925028e-003   
  4   -9.804488e-002   
  5   -3.848729e-002   
  6   1.898830e-001   
  7   4.045169e-001   
  8   4.045168e-001   
  9   1.898829e-001   
  10   -3.848736e-002   
  11   -9.804485e-002   
  12   -7.924644e-003   
  13   6.781681e-002   
  14   3.078794e-002   
  15   -4.854676e-002



Program for converting h(t) coefficients of the FIR to AFR data

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
// irtoafr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
#include <cstdio> // or  cstdio.h
#include <cstdlib> //or  cstdlib.h
#include <cmath>   //or  cmath.h
 
#define M_PI 3.1415926535897932384626433832795
#define PI M_PI // 3.14159265 
#define  NMAX 512
FILE *fp, *fp1;
int w,t,N;
double h[NMAX];
double h_im[NMAX];
double Re_H[NMAX];
double Im_H[NMAX];
double Re_x[NMAX];
double Im_x[NMAX];
double abs_H[NMAX];
double arg_h[NMAX];
double f[NMAX];
double angle;
double   K, fs,T,Tmax;
char str;
char key;
int k,n;
 
 
/*
float x[N];
float y[N];
 
double my_FIR(double sample_data, int Nf)
{
  double result = 0;
  for ( int i = Nf - 2 ; i >= 0 ; i-- )
  {
    x[i + 1] = x[i];
    y[i + 1] = y[i];
  } 
  x[0] = (double)sample_data; 
  for (int k = 0; k < N; k++)
  {
    result = result + x[k]*h[k];
  }
  y[0] = result;
  return ((double)result);
}
 
*/
 
 
float heavi( double t) 
{
if (t<0 ) return 0;
if (t>=0) return 1;
}
 
float heavi1( int n) 
{
if (n<0 ) return 0;
if (n>=0) return 1;
}
 
 
float dirac( int n) 
{
if (n!=0 ) return 0;
if (n=0) return 1;
}
 
double getarg(float Re_H,float Im_H)
{
return atan2(Im_H,Re_H) * 180/ PI;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
//double tau=0.02;
//printf(" Input tau , s ");
//scanf("%le",&tau);
printf ("\n For input  h(t) from file input '1' ");
printf ("\n For manual  input  h(t) input   '0' ");
scanf("%s",&key);
if (key=='0' ) { goto label_02;}
if (key=='1' ) { goto label_01;}
 
label_01:
  printf("\n Open htkoefs.txt for reading h[n] coefficients ");
if ((fp=fopen("htkoefs.txt","r"))==NULL)  printf ("\n File opening error");
fscanf(fp,"%le",&fs);
fscanf(fp,"%d",&N);
Tmax=N*1/fs;
for (n=0 ; n<N;n++)
{ 
 fscanf (fp,"%d",&k);
 fscanf (fp,"%le",&h[n]);
}
fclose(fp);
goto label_03; 
label_02:
 
 
printf("\n Input fs ,Hz ");
scanf("%le",&fs);
printf(" Input  number of points ");
scanf("%d",&N);
Tmax=N*1/fs;
printf("\n Tmax =%lf s \n", Tmax); 
 
for (n=0 ; n<N;n++)
{
 T=n*1/(N*fs); 
 printf("\nT=%le s; n =%d ; input h(n): ",T,n);
 scanf ("%le",&h[n]);
 
/*
h[0]=-0.0485469;
h[1]=+0.0307880;
h[2]=+0.0678165;
h[3]=-0.0079250;
h[4]=-0.0980449;
h[5]=-0.0384873;
h[6]=+0.1898828;
h[7]=+0.4045168;
h[8]=+0.4045168;
h[9]=+0.1898828;
h[10]=-0.0384873;
h[11]=-0.0980449;
h[12]=-0.0079250;
h[13]=+0.0678165;
h[14]=+0.0307880;
h[15]=-0.0485469;
*/
//tau=0.1*Tmax;
//h[t]=1-exp(-T/tau);
}
 
label_03:
printf("\n Fs=%lf Hz",fs);
printf("\n N=%d  points",N);
for (n=0 ; n<N;n++)
{
 T=n*1/(N*fs); 
 printf("\n t=%le s; h[t]=%le   ",T,h[n]);
}
 
printf("\n Input 0 for next ");
scanf("%s",&key);
printf("\n OK. Parsing ... ");
 
// H(jw)=integr(0;inf;h(tau)*exp(-j*w*tau) ; d tau)
// 
/*
DFT
X[k]=sum(n=0;N-1; x[n]*exp(-2*pi*j*k*n/N) ), k=0,...,N-1
IDFT
x[n]=(1/N)*sum(k=0;N-1;X[k]*exp(2*pi*k*n/N) ), n=0,...,N-1
*/
 
/*********************************************************/
 
label1:
 printf("\n Open afrcoefs.txt for reading AFR coefficients ");
if ((fp1=fopen("afrcoefs.txt","a"))==NULL)  printf ("\n File opening error");
fprintf(fp1,"\n   %le  %d ",fs,N);
/*
fprintf(fp1,"\n Re(H(jw))  ; Im(H(jw)) ");
for (k=0 ; k<N; k++)
{
 Re_H[k]=0;
 Im_H[k]=0;
  for(n=0;n<N;n++)
  {    
   angle=-2*PI*k*n/N;
 //  Re_H[k] = Re_H[k]+ h[n]*cos(angle) - h_im[n]*sin(angle);
 //  Im_H[k] = Im_H[k]+ h[n]*sin(angle) + h_im[n]*cos(angle); 
     Re_H[k] = Re_H[k]+ h[n]*cos(angle) ;//- h_im[n]*sin(angle);
     Im_H[k] = Im_H[k]+ h[n]*sin(angle) ;//+ h_im[n]*cos(angle); 
  }
 
// 1/n scaled DFT(h(t)*1(t))
 //Re_H[k]=Re_H[k]/N ;
 //Im_H[k]=Im_H[k]/N ;
   abs_H[k]=pow(((Re_H[k]*Re_H[k])+(Im_H[k]*Im_H[k])), 0.5);
   arg_h[k]=getarg(Re_H[k],Im_H[k]);
   f[k]=k*fs/N;  
     printf("\n n=%d Re(H(jw))= %lf ; Im(H(jw))= %lf ; f=%lf Hz",k, Re_H[k] ,Im_H[k], f[k]) ; 
     fprintf(fp1,"\n n=%d Re(H(jw))= %lf ; Im(H(jw))= %lf ; f=%lf Hz",k, Re_H[k] ,Im_H[k], f[k]) ; 
}
 
printf("\n Input 0 for continue ");
scanf("%s",&key);
*/
 //fprintf(fp1,"\n |H(jw)| , arg( H(jw) ) ");
  
for (k=0 ; k<N; k++)
{
 Re_H[k]=0;
 Im_H[k]=0;
  for(n=0;n<N;n++)
  {   
   angle=-2*PI*k*n/N;
 //  Re_H[k] = Re_H[k]+ h[n]*cos(angle) - h_im[n]*sin(angle);
 //  Im_H[k] = Im_H[k]+ h[n]*sin(angle) + h_im[n]*cos(angle); 
     Re_H[k] = Re_H[k]+ h[n]*cos(angle) ;//- h_im[n]*sin(angle);
     Im_H[k] = Im_H[k]+ h[n]*sin(angle) ;//+ h_im[n]*cos(angle); 
  }
 
 // 1/n scaled DFT(h(t)*1(t))
 //Re_H[k]=Re_H[k]/N ;
 //Im_H[k]=Im_H[k]/N ;
 
   abs_H[k]=pow(((Re_H[k]*Re_H[k])+(Im_H[k]*Im_H[k])), 0.5);
   arg_h[k]=getarg(Re_H[k],Im_H[k]);
   f[k]=k*fs/N;
   printf("\n n=%d |H(jw)|= %lf ; arg(H(jw))= %lf; f=%lf Hz",k, abs_H[k] ,arg_h[k], f[k]) ; 
    //fprintf(fp1,"\n n=%d |H(jw)|= %lf ; arg(H(jw))= %lf; f=%lf Hz",k, abs_H[k] ,arg_h[k], f[k]) ; 
   fprintf(fp1,"\n  %d   %le    %le    %le  ",k, abs_H[k] ,arg_h[k], f[k]) ;
}
fclose(fp1);
printf("\n Input 0 for exit ");
scanf("%s",&key);
 
return 0;
}
 
//cidft
/*
for (n=0 ; n<N; n++)
{
 Re_x[n]=0;
 Im_x[n]=0;
  for(k=0;k<N;n++)
  {  
//  angle = 2 * PI * k * N / numidft
//  idft_xnre(N + 1) = idft_xnre(N + 1) + idft_Xkre(k + 1) * Cos(angle) - idft_Xkim(k + 1) * Sin(angle)
//  idft_xnim(N + 1) = idft_xnim(N + 1) + idft_Xkre(k + 1) * Sin(angle) + idft_Xkim(k + 1) * Cos(angle) 
   angle=2*PI*k*n/N;
   Re_H[k]=abs_H[k]*cos(angle);
   Im_H[k]=abs_H[k]*sin(angle);
    Re_x[n] = Re_x[n]+ Re_H[k]*cos(angle)- Im_H[k]*sin(angle);
    Im_x[n] = Im_x[n]+ Re_H[k]*sin(angle)+ Im_H[k]*cos(angle);
  }
 Re_x[n]=Re_x[n]/N ;
 Im_x[n]=Im_x[n]/N ;
 // n scaled CIDFT( )
 //Re_x[n]=Re_x[n]*N;   
 //Im_x[n]=Im_x[n]*N;   
 //  abs_H[k]=pow(((Re_H[k]*Re_H[k])+(Im_H[k]*Im_H[k])), 0.5);
 //  arg_h[k]=getarg(Re_H[k],Im_H[k]);
 //  T[k]=k*fs/N;
   printf("\n n=%d  Re(h(n))=%d   ",n, Re_x[n] ,Im_x[n]  ) ;
 
}
 
*/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// stdafx.cpp : source file that includes just the standard includes
// irtoafr.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
 
#include "stdafx.h"
 
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
 
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>


Implementation of the FIR

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
// fir.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
#include <cstdio> // or  cstdio.h
#include <cstdlib> //or  cstdlib.h
#include <cmath>   //or  cmath.h
 
 
#define  NMAX 512
FILE *fp, *fp1, *fp2;
int w,t,N,N1;
double h[NMAX];
double xin[NMAX];
double yout[NMAX];
double f[NMAX];
 
double   K, fs,T,Tmax;
char str;
char key;
int k,n,i;
 
 
double my_FIR(double sample_data, int Nf,  double *h)
{
static double x[NMAX];
static double y[NMAX];
 
  double result = 0;
  for ( int i = Nf - 2 ; i >= 0 ; i-- )
  {
    x[i + 1] = x[i];
    y[i + 1] = y[i];
  } 
  x[0] = (double)sample_data; 
  for (int k = 0; k < Nf; k++)
  {
    result = result + x[k]*h[k];
  }
  y[0] = result;
  return ((double)result);
}
 
 
 
 
float heavi( double t) 
{
if (t<0 ) return 0;
if (t>=0) return 1;
}
 
float heavi1( int n) 
{
if (n<0 ) return 0;
if (n>=0) return 1;
}
 
 
float dirac( int n) 
{
if (n!=0 ) return 0;
if (n=0) return 1;
}
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
printf ("\n For input  h(t) from file input '1' ");
printf ("\n For manual  input  h(t) input   '0' ");
scanf("%s",&key);
if (key=='0' ) { goto label_02;}
if (key=='1' ) { goto label_01;}
 
label_01:
 
 printf("\n Open htkoefs.txt for reading h[n] coefficients ");
if ((fp=fopen("htkoefs.txt","r"))==NULL)  printf ("\n File opening error");
fscanf(fp,"%le",&fs);
fscanf(fp,"%d",&N);
 
for (n=0 ; n<N;n++)
{ 
 fscanf (fp,"%d",&k);
 fscanf (fp,"%le",&h[n]);
}
 
 
fclose(fp);
goto label_03;
 
label_02:
 
 
printf("\n Input fs ,Hz " );
scanf("%le",&fs);
printf(" Input order ");
scanf("%d",&N);
  
 
for (n=0 ; n<N;n++)
{
 
 printf("\n   n =%d ; input h[n]: " ,n);
 scanf ("%le",&h[n]);
 
}
 
label_03:
printf("\n Fs coefs=%lf Hz ",fs);
printf("\n order=  %d     ",N);
 
for (n=0 ; n<N;n++)
{
 printf("\n  n =%d ; h[n]=%le   ",n,h[n]);
}
 
printf("\n Input 0 for continue ");
scanf("%s",&key);
printf("\n OK.   ");
 
 
printf ("\n For input  x(t) from file input '1' ");
printf ("\n For manual  input  x(t) input   '0' ");
scanf("%s",&key);
if (key=='1' ) { goto label_05;}
if (key=='0' ) { goto label_06;}
 
label_05:
 
 printf("\n Open input.txt for reading x[n]   ");
if ((fp1=fopen("input.txt","r"))==NULL)  printf ("\n File opening error ");
fscanf(fp1,"%le",&fs);
fscanf(fp1,"%d",&N1);
 
for (n=0 ; n<N1;n++)
{ 
 fscanf (fp1,"%d",&k);
 fscanf (fp1,"%le",&xin[n]);
}
 
 
fclose(fp1);
 
goto label_07;
 
label_06:
 
printf("\n Input fs,Hz , ( %lf ) ",fs) ;
scanf( "%le",&fs);
printf("\n Input number of samples of xin[n]  ") ;
scanf( "%d",&N1);
 
for (n=0 ; n<N1;n++)
{ 
 T=n*1/(N1*fs); 
 printf ("\n n=%d ; t=%le s; xin[n]= ",n,T);
 scanf ( "%le",&xin[n]);
}
 
 label_07:
printf( "\n fs=%le Hz ",fs);
printf( "\n Nsamples= %d ",N1);
 
for (n=0 ; n<N1;n++)
{ 
 T=n*1/(N1*fs); 
 printf("\n n=%d x[n]=%le,  t=%le s",n,xin[n],T);
}
 
printf("\n Input 0 for continue ");
scanf("%s",&key);
printf("\n OK.   ");
 
/*********************************************************/
 
label1:
  printf("\n Open output.txt for writing sequence   ");
 
if ((fp2=fopen("output.txt","a"))==NULL)  printf ("\n File opening error");
fprintf(fp2,"\n   %le  %d \n",fs,N);
 
for (i=0 ;  i<N1;i++)
{
 T=i*1/(N1*fs);
yout[i]= my_FIR(xin[i], N,h);
 printf( "\n n=%d t=%le s; yout[n]= %le ",i,T,yout[i] );
fprintf(fp2,"\n %d  %le ",i,yout[i] );
}
 
 
fclose(fp2);
printf("\n Input 0 for exit ");
scanf("%s",&key);
 
return 0;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// stdafx.cpp : source file that includes just the standard includes
// fir.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
 
#include "stdafx.h"
 
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
 
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
 
// TODO: reference additional headers your program requires here

input.txt
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4.410000e+004   16
 
 0  1.000000e+001   
 1  7.071068e+000   
 2  6.123032e-016   
 3  -7.071068e+000   
 4  -1.000000e+001   
 5  -7.071068e+000   
 6  -1.836910e-015   
 7  7.071068e+000   
 8  1.000000e+001   
 9  7.071068e+000   
 10  3.061516e-015   
 11  -7.071068e+000   
 12  -1.000000e+001   
 13  -7.071068e+000   
 14  -4.286122e-015   
 15  7.071068e+000
htkoefs.txt

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  4.410000e+004   16
  0   0  
  1   1  
  2   0   
  3   0   
  4   0   
  5   0   
  6   0  
  7   0   
  8   0   
  9   0   
  10  0   
  11  0   
  12  0   
  13  0   
  14  0   
  15  0
output.txt

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4.410000e+004  16
 
 0  0.000000e+000 
 1  1.000000e+001 
 2  7.071068e+000 
 3  6.123032e-016 
 4  -7.071068e+000 
 5  -1.000000e+001 
 6  -7.071068e+000 
 7  -1.836910e-015 
 8  7.071068e+000 
 9  1.000000e+001 
 10  7.071068e+000 
 11  3.061516e-015 
 12  -7.071068e+000 
 13  -1.000000e+001 
 14  -7.071068e+000 
 15  -4.286122e-015
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2018, 01:01
Ответы с готовыми решениями:

DSP FIR выбор функции
Добрый вечер. Необходимо периодически делать выборку частоты , фильтровать ее и определять усредненный уровень сигнала. Планирую...

КИХ фильтр (FIR) по Куприянову, Матюшкину.
Здравствуйте! Плохо знаком с MATLAB, но весь день борюсь с ним.... Дело в том, что пытаюсь получить коэффициенты КИХ ФИЛЬТРА как в книге...

Как подружить мать p45c neo-fir с новой памятью?
Имеется мать p45c neo-fir (ms 7572), на которой расположен xeon x5640, две плашки 2-х сторонние ddr2 2gb. Купил HyperX HX316LC10FB/4 две...

26
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
30.06.2018, 01:03  [ТС] 2
Program for spectrum calculating, using CDFT,CIDFT, Mathlab's algorithm for Hilbert transform

You can use complex.h, vector.h for data arrays and pointered arrays for arrays.

How to use radix more then 20000 in #define NMAX , how to fix memory mapping error in arrays if NMAX>20000...32768?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
// getspec.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <limits>
#include <iostream>
using namespace std;
 
#define NMAX 2048
 
#define M_PI 3.1415926535897932384626433832795
 
typedef struct {
 
double re[NMAX];
double im[NMAX];
} CData;
 
 typedef struct  {
     double data[NMAX];
 } Array;
 
 
CData  cdft(CData xn  ,int N ) 
 {
    
  
 CData Xk ;
 int k,n  ;
 double angle;
 
 for (k=0;k<N;k++)
  {
  Xk.re[k]=0;
  Xk.im[k]=0;
  for(n=0;n<N;n++)
    {
    angle=-2*M_PI*k*n/N;   
    Xk.re[k]=Xk.re[k]+xn.re[n]*cos(angle)- xn.im[n]*sin(angle);
    Xk.im[k]=Xk.im[k]+xn.re[n]*sin(angle)+ xn.im[n]*cos(angle);
    }
 
 }
 
 return Xk;
 }
 
 CData  cidft(CData idft_Xk, int N  )
 {
 
 int k,n ;
 double angle;
 CData  idft_xn;
  
 //N=sizeof(xk)/sizof(double);
 //ifft
  for (n=0;n<N;n++)
  {
  idft_xn.re[n]=0;
  idft_xn.im[n]=0;
  for(k=0;k<N;k++)
   {
 
   angle=2*M_PI*k*n/N;
   idft_xn.re[n]=idft_xn.re[n]+idft_Xk.re[k]*cos(angle)-idft_Xk.im[k]*sin(angle);
   idft_xn.im[n]=idft_xn.im[n]+idft_Xk.re[k]*sin(angle)+idft_Xk.im[k]*cos(angle);
   }
 
 idft_xn.im[n]=idft_xn.im[n]/N;
 idft_xn.re[n]=idft_xn.re[n]/N;
 
 }
 
return idft_xn ;
 }
 
CData ScaleDFT(CData xk,int  num)
 {
 
 int i;
 for (i=0; i<num ; i++)
   {
    xk.re[i]=xk.re[i]/num;
    xk.im[i]=xk.im[i]/num;
   }
 return xk;
 }
 
CData ScaleIQidft(CData Xk, int num)
 {
 int i;
   for (i=0;  i<num ; i++)
  {
   Xk.re[i]=Xk.re[i]*num;
   Xk.im[i]=Xk.im[i]*num;
  }
 
return Xk;
 
}
 
 CData hilbert(double *xr , int N)
 {
  int  k,n,i, no2 ;
  double angle;
  double h[NMAX];
  double dft__xn_re[NMAX];
  double dft__xn_im[NMAX]; 
   double dft__Xk_re[NMAX];
   double dft__Xk_im[NMAX];
     double idft__XK_re[NMAX];
     double idft__XK_im[NMAX];
   CData idft__XN;
 
  
  if (N==0)
  {
  printf("\n Error");
  idft__XN.re[0]=0;
  idft__XN.im[0]=0;
  return idft__XN;
  }
  //xnreal=real(xr);
  no2=(int) floor ((double)N/2);
  
  for (i=0;i<N;i++)
  {
   dft__xn_re[i]=xr[i];
   dft__xn_im[i]=0;
  }
 
 //fft
 // dft__Xk=dft(dft__xn,n);
 
for (k=0;k<N;k++)
  {
  dft__Xk_re[k]=0;
  dft__Xk_im[k]=0;
  for(n=0;n<N;n++)
    {
    angle=-2*M_PI*k*n/N;
    dft__Xk_re[k]+= dft__xn_re[n]*cos(angle)- dft__xn_im[n]*sin(angle);
    dft__Xk_im[k]+= dft__xn_re[n]*sin(angle)+ dft__xn_im[n]*cos(angle);
    }
 
 }
 
 //X={Xk.re,Xk.im};
 
 for (i=0;i<=N;i++)
  {
  h[i]=0;
  }
 
 
  if((N>0)&&(( 2*floor((double)N/2) )==(N))) // n is even 
  {
 
  h[0]=1;
   h[N/2]=1;
   for(k=1;k<N/2;k++)
   {
   h[k]=2;
   }
  }
  else //n is odd
  { 
    if(N>0)
    {
     h[0]=1;
     for(k=1;k<(N+1)/2;k++)
     {
     h[k]=2;
     }
    }
  }
 
 for(i=0;i<N;i++)
  {
  idft__XK_re[i]= dft__Xk_re[i]*h[i];
  idft__XK_im[i]= dft__Xk_im[i]*h[i];
  }
 
 
 //idft__XN= idft(idft__XK, n);
  
 //N=sizeof(xk)/sizof(double);
 //ifft
  for (n=0;n<N;n++)
  {
  idft__XN.re[n]=0;
  idft__XN.im[n]=0;
  for(k=0;k<N;k++)
   {
   //(a+bi)(c+di)=  (ac -bd) + (ad + bc)i
   angle=2*M_PI*k*n/N;
   idft__XN.re[n]+=idft__XK_re[k]*cos(angle)-idft__XK_im[k]*sin(angle);
   idft__XN.im[n]+=idft__XK_re[k]*sin(angle)+idft__XK_im[k]*cos(angle);
   }
 idft__XN.im[n]=idft__XN.im[n]/N;
 idft__XN.re[n]=idft__XN.re[n]/N;
 
 }
 
 
return idft__XN;
 }
 
CData getanalyticsignal(double *xn, int num)
 {
 CData x_n,Hilb;
 int i;
   //x=x+jy,y=0
   //hilb(x)=a+jb
   //z=x+jHilb(x)=x+j(a+jb)=x-b+j*a
   //I=x(t), Q=j*Hilb(xre(t))
 
Hilb=hilbert(xn,num);
  
 for (i=0; i<num; i++)
 { 
  x_n.re[i]=xn[i];
  x_n.im[i]=Hilb.im[i];
 } 
  
 return x_n;
 }
 
 
 
double Arg(double re, double im)
{
 
return atan2 (im,re)  ; 
}
 
CData  get_mod_fi(CData x, int n, int mode   )
 {
  int i;
  CData res;
  double fi;
  for (i=0;i<n;i++)
  {
  res.re[i]=pow((x.re[i]*x.re[i]+x.im[i]*x.im[i]),0.5);
  //double treshh=1e9;
  // x.im[i]=x.im[i]*treshh;
  // x.im[i]=floor(x.im[i])/treshh;
  // x.re[i]=x.re[i]*treshh;
  // x.re[i]=floor(x.re[i])/treshh;
  res.im[i]=Arg(x.re[i],x.im[i]);
  if (mode==1)  { res.im[i]=res.im[i]*180/M_PI;  } 
           
  }
  return  res; 
 }
 
CData GetSpectrum(double *xn, int num)
{
 
CData xn_iq, Xf_IQ, Xf_modfi;
xn_iq=getanalyticsignal( xn,  num);
 
Xf_IQ=cdft(xn_iq  ,num );
Xf_IQ=ScaleDFT(Xf_IQ,num);
Xf_modfi=get_mod_fi(Xf_IQ, num,1   );
 
return Xf_modfi;
}
 
Array getenvelope(double *x, int num)
 {
 int i;
 CData  y;
 Array env;
 y=hilbert(x,num);
 for (i=0;i<num;i++)
  {
  env.data[i]=pow(((y.re[i]*y.re[i])+(y.im[i]*y.im[i])),0.5);
  }
  return env;
 }
 
FILE   *fp1,*fp2 ;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
double xin[NMAX];
CData  Xf;
 
char key;
int k,n,i,N1;
double fs,T,x,f;
 
 
printf ("\n For input  x(t) from file input '1' ");
printf ("\n For manual  input  x(t) input   '0' ");
scanf("%s",&key);
if (key=='1' ) { goto label_05;}
if (key=='0' ) { goto label_06;}
 
label_05:
 
 printf("\n Open xinput.txt for reading x[n]   ");
if ((fp1=fopen("xinput.txt","r"))==NULL)  printf ("\n File opening error ");
fscanf(fp1,"%le",&fs);
fscanf(fp1,"%d",&N1);
 
for (n=0 ; n<N1;n++)
{ 
 fscanf (fp1,"%d",&k);
 fscanf (fp1,"%le",&xin[n]);
}
 
 
fclose(fp1);
 
goto label_07;
 
label_06:
 
printf("\n Input fs,Hz , ( %lf ) ",fs) ;
scanf( "%le",&fs);
printf("\n Input number of samples of xin[n]  ") ;
scanf( "%d",&N1);
 
for (n=0 ; n<N1;n++)
{ 
 T=n*1/(N1*fs); 
 printf ("\n n=%d ; t=%le s; xin[n]= ",n,T);
 scanf ( "%le",&xin[n]);
}
 
 label_07:
printf( "\n fs=%le Hz ",fs);
printf( "\n Nsamples= %d ",N1);
 
for (n=0 ; n<N1;n++)
{ 
 T=n*1/(N1*fs); 
 printf("\n n=%d x[n]=%le,  t=%le s",n,xin[n],T);
}
 
printf("\n Input 0 for continue ");
scanf("%s",&key);
printf("\n OK.   ");
 
 
/*****************************/
 
label1:
//Xf.re= |Xf|,  Xf.im -arg(Xf) (only in this program)
printf("\n Obtaining spectrum of x[n]");
Xf=GetSpectrum(xin, N1);
 
printf("\n Spectrum of x[n] : ");
 
 if ((fp2=fopen("spectrum.txt","a"))==NULL)  printf ("\n File opening error");
 fprintf(fp2,"\n   %le   %d \n",fs,N1);
 //fprintf(fp2, "\n n;\t f, Hz;\t |Xf(jw)| ;\t  arg(Xf), deg ");
for (i=0; i<N1;i++)
{
f=fs*i/N1;
//cout <<"\n f="<< f<<" Hz;|Xf(jw)|="<<Xf.re[i]<<";arg(Xf)="<<Xf.im[i]<<" deg ";
 printf ("\n f=%le Hz;|Xf(jw)|=%le;arg(Xf)=%lf deg ",  f,Xf.re[i], Xf.im[i]);
 fprintf(fp2,"\n %d   %le  %le",i ,Xf.re[i],Xf.im[i]);
 
}
printf ("\n  input   '0' for exit ");
char key1;
cin>>key1;
 
return 0;
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// stdafx.cpp : source file that includes just the standard includes
// getspec.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
 
#include "stdafx.h"
 
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
 
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <stdio.h> //edit 
#include <tchar.h> //edit
 
// TODO: reference additional headers your program requires here
xinput.txt

4.410000e+004 16

0 1.000000e+001
1 7.071068e+000
2 6.123032e-016
3 -7.071068e+000
4 -1.000000e+001
5 -7.071068e+000
6 -1.836910e-015
7 7.071068e+000
8 1.000000e+001
9 7.071068e+000
10 3.061516e-015
11 -7.071068e+000
12 -1.000000e+001
13 -7.071068e+000
14 -4.286122e-015
15 7.071068e+000
spectrum.txt

4.410000e+004 16

0 7.216450e-016 -1.126199e+002
1 7.237769e-016 -8.560129e+001
2 1.000000e+001 9.223608e-015
3 9.436896e-016 1.800000e+002
4 3.373574e-016 3.464047e+001
5 5.950643e-015 -5.660642e+001
6 1.330312e-007 1.800000e+002
7 7.196406e-015 -2.652734e+000
8 3.760637e-015 -7.363206e+001
9 3.624946e-015 -1.272209e+002
10 2.820163e-015 1.438068e+002
11 5.525033e-015 -1.015922e+002
12 4.814310e-015 7.423349e+000
13 1.110917e-014 6.612472e+001
14 6.445273e-015 -9.246812e+001
15 8.760391e-015 -1.326889e+002
Возможно ли перевести их на Дельфи ?
0
30.06.2018, 06:30 3
 Комментарий модератора 
USERPC01, еще одна такая портянка неформатированного кода - и Вы получите карту за нарушение п. 4.9 Правил форума
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
30.06.2018, 21:20  [ТС] 4
Как использовать в Дельфи ( или FPC /Lazarus) статическте массивы переменных , уничтожаемые после команды деструктор класса фильтра? Нужно ли использовать внешний класс-хранитель с деструктором, как избежать "утечки" памяти? (В fir.cpp :
C++
1
2
3
4
5
6
double my_FIR(double sample_data, int Nf,  double *h)
{
static double x[NMAX];
static double y[NMAX];
...
)
Добавлено через 23 минуты
Нужно использовать статический тип переменных , как в С++, чтобы программа была модульной (чтобы создать массив классов FIR, требуемой архитектуры ), чтобы не выкладывать переменные на шару, а задавать внутри процедуры как статические (в Си++ смысле).
0
442 / 371 / 132
Регистрация: 09.09.2011
Сообщений: 1,339
06.07.2018, 02:07 5
USERPC01, для вас какой язык родной?

можно статические как в с++, они будут в стеке хранится и уничтожаться при выходе из функции - утечек не будет,
либо используй динамические массивы как тут написано:

https://www.freepascal.org/doc... #QQ2-38-57
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
27.07.2018, 20:46  [ТС] 6
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
program Project1;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  Classes,System.SysUtils;
  //FIRCOEFS in 'FIRCOEFS.pas';
 
 
 
 
 
 procedure main();
 
 
 const
     M_PI=3.1415926535897932384626433832795    ;
    // NMAX=512 ;
 var
    k,n: integer;
    w,t, Num : integer ;
    h : array   of real;
    h_im : array   of real;
    Re_H  : array   of real;
    Im_H :array   of real ;
    Re_x :array  of real;
    Im_x : array  of real  ;
    abs_H  : array   of real ;
    arg_H : array   of real ;
    f :  array   of real  ;
    angle : real ;
     K1, fs, finp,Tmax :real;
     str: string;
     key: string;
     fp,fp1 : TextFile;
      NMAX : integer;
 
 
  label
    label1,label3, label_01, label_02,label_03;
 begin
 
 
    // afrtohtcoefs.cpp : Defines the entry point for the console application.
    writeln(' *****  AFR to h(t) coeffs of FIR  ***** ' );
    writeln(' Input Order of FIR (NMAX) : ' );
    read (NMAX);
 
  SetLength(h, NMAX);
  SetLength(h_im, NMAX);
  SetLength(Re_H, NMAX);
  SetLength(Im_H, NMAX);
  SetLength(Re_x, NMAX);
  SetLength(Im_x, NMAX);
  SetLength(abs_H, NMAX);
  SetLength(arg_H, NMAX);
  SetLength(f, NMAX);
 
 
 writeln (' For input  |H(jw)|, fi(w) from file input "1" ');
 writeln(' For manual  input |H(jw)|, fi(w) input   "0" ');
 readln (key);
 if (key= '0' ) then  goto label_02;
 if (key= '1' ) then  goto  label_01;
 
label_01:
 writeln(' Open afrcoefs.txt for reading AFR coefficients ');
  //Assign(fp , 'afrcoefs.txt') ;
 
 
     AssignFile (fp , 'afrcoefs.txt') ;
     Reset(fp);
 
     readln(fp, fs);
     readln(fp, Num);
     Tmax:=Num*1/fs;
      for  k:=0 to  Num-1 do
      begin
 
      readln  (fp, n);
      read  (fp, abs_H[k]);
      read   (fp, arg_H[k]);
 
      read  (fp, f[k]);
 
       arg_H[k]:=arg_H[k]*M_PI/180;
     end;
    CloseFile(fp);
 
 
 
 
 goto label_03;
 
label_02:
 
 writeln(' Input fs ,Hz ');
 readln( fs);
 writeln(' Input  number of points ');
 readln( Num);
 Tmax:=N*1/fs;
 writeln(' Tmax = ', Tmax,' s');
 for  k:=0 to Num-1 do
 begin
  f[k]:=k*fs/Num;
 
 
      writeln('F= ' ,f[k],'Hz');
      writeln(' k=',k,';    |H(jw)|[k]=',k );
      readln ( abs_H[k]);
      writeln(' k=',k,';   arg(H(jw))[k]=',k );
      readln (  arg_H[k]);
 
 arg_H[k]:=arg_H[k]*M_PI/180;
 end ;
 
label_03:
 
 for  k:=0 to   Num-1 do
 begin
 f[k]:=k*fs/Num;
 writeln(' n=',k,' ;|H(jw)|= ',abs_H[k],' ;arg(H(jw))=',arg_H[k]*180/M_PI, 'deg; f= ', f[k],' Hz') ;
 
 end;
 
 
 writeln(' Input 0 for continue  ');
 readln( key);
 writeln(' OK. Parsing ...');
 
 // H(jw)=integr(0;inf;h(tau)*exp(-j*w*tau) ; d tau)
 //K=2*3.1415926/fs;
 {
 DFT
 X[k]=sum(n=0;N-1; x[n]*exp(-2*pi*j*k*n/N) ), k=0,...,N-1
 IDFT
 x[n]=(1/N)*sum(k=0;N-1;X[k]*exp(2*pi*k*n/N) ), n=0,...,N-1
 100*10^-6*500
 }
 
label1:
 
 
//cidft
 writeln(' Open hcoefs1.txt for writing coeffs h[n] ');
   AssignFile(fp1, 'hcoefs1.txt') ;
 
   // Rewrite(fp1);
   // Append(fp1);
     if FileExists('hcoefs1.txt') then Append(fp1)
    else Rewrite(fp1);
 
 
 
 writeln(fp1,   fs, Num );
 for  n:=0 to  Num-1 do
  begin
  Re_x[n]:=0;
  Im_x[n]:=0;
  for k:=0 to Num-1 do
  begin
   angle:=2*M_PI*k*n/Num;
        //Uoutp[w]/Uinp[w]   exp(j( fi out[w]-fi inp[w]) )
   Re_H[k]:=abs_H[k]*cos(arg_H[k]);
   Im_H[k]:=abs_H[k]*sin(arg_H[k]);
    Re_x[n] := Re_x[n]+  Re_H[k]*cos(angle)-Im_H[k]*sin(angle);
    Im_x[n] := Im_x[n]+  Re_H[k]*sin(angle) + Im_H[k]*cos(angle);
  end;
  Re_x[n]:= Re_x[n]/Num ;
  Im_x[n]:= Im_x[n]/Num ;
 
    //printf("\n n=%d  Re(h(n))=%lf  Im(h(n))=%lf ",n, Re_x[n] ,Im_x[n]  ) ;
    writeln(' n=',n,'   h[n]= ',  Re_x[n]    ) ;
    writeln(fp1,  n, Re_x[n]  ) ;
 end;
 writeln(fp1, ' ' );
 CloseFile (fp1);
 
 writeln( '  Re(h(n)=h[n]), use it to load into FIR  '   ) ;
label3:
 writeln(' Input 0 for exit ');
 readln( key);
 
end;
 
 
 
 
 
begin
  try
 
         main;
 
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Добавлено через 45 минут
исправлено чтение из файлов и запись в файл
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
program Project1;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  Classes,System.SysUtils,Math; //   System.SysUtils;
  //FIRCOEFS in 'FIRCOEFS.pas';
 
 
 
 
 
 procedure main();
 
 
 const
     M_PI=3.1415926535897932384626433832795    ;
    // NMAX=512 ;
 var
    k,n: integer;
    w,t, Num : integer ;
    h : array   of real;
    h_im : array   of real;
    Re_H  : array   of real;
    Im_H :array   of real ;
    Re_x :array  of real;
    Im_x : array  of real  ;
    abs_H  : array   of real ;
    arg_H : array   of real ;
    f :  array   of real  ;
    angle : real ;
     K1, fs, finp,Tmax :real;
     str: string;
     key: string;
     fp,fp1 : TextFile; //File of real;
      NMAX : integer;
 
 
  label
    label1,label3, label_01, label_02,label_03;
 begin
 
 
    // afrtohtcoefs.cpp : Defines the entry point for the console application.
    writeln(' *****  AFR to h(t) coeffs of FIR  ***** ' );
    writeln(' Input Order of FIR (NMAX) : ' );
    readln (NMAX);
 
  SetLength(h, NMAX);
  SetLength(h_im, NMAX);
  SetLength(Re_H, NMAX);
  SetLength(Im_H, NMAX);
  SetLength(Re_x, NMAX);
  SetLength(Im_x, NMAX);
  SetLength(abs_H, NMAX);
  SetLength(arg_H, NMAX);
  SetLength(f, NMAX);
 
 
 writeln (' For input  |H(jw)|, fi(w) from file input "1" ');
 writeln(' For manual  input |H(jw)|, fi(w) input   "0" ');
 readln (key);
 if (key= '0' ) then  goto label_02;
 if (key= '1' ) then  goto  label_01;
 
label_01:
 writeln(' Open afrcoefs.txt for reading AFR coefficients ');
  //Assign(fp , 'afrcoefs.txt') ;
 
 
     AssignFile (fp , 'afrcoefs.txt') ;
     Reset(fp );
 
     read  (fp, fs ,Num );
     writeln('fs=',fs);
     writeln('Num=',Num);
     Tmax:=Num*1/fs;
      for  k:=0 to  Num-1 do
      begin
      read   (fp,n);
      read   ( fp,    abs_H[k]);
      read   (fp,     arg_H[k]);
      read(fp, f[k] );
 
 
 
 
 
       arg_H[k]:=arg_H[k]*M_PI/180;
     end;
    CloseFile(fp);
 
 
 
 
 goto label_03;
 
label_02:
 
 writeln(' Input fs ,Hz ');
 readln( fs);
 writeln(' Input  number of points ');
 readln( Num);
 Tmax:=N*1/fs;
 writeln(' Tmax = ', Tmax,' s');
 for  k:=0 to Num-1 do
 begin
  f[k]:=k*fs/Num;
 
 
      writeln('F= ' ,f[k],'Hz');
      writeln(' k=',k,' | H(jw)|[k]= ? ',k );
      readln ( abs_H[k]);
      writeln(' k=',k,' arg(H(jw))[k]=? ',k );
      readln (  arg_H[k]);
 
 arg_H[k]:=arg_H[k]*M_PI/180;
 end ;
 
label_03:
 
 for  k:=0 to   Num-1 do
 begin
 f[k]:=k*fs/Num;
 writeln(' n=',k,' ; f= ', f[k],' Hz ' );
 writeln('  |H(jw)|=   ',abs_H[k],' arg(H(jw))=',(arg_H[k]*180/M_PI), 'deg ');
 
 
 
 end;
 
 
 writeln(' Input 0 for continue  ');
 readln( key);
 writeln(' OK. Parsing ...');
 
 // H(jw)=integr(0;inf;h(tau)*exp(-j*w*tau) ; d tau)
 //K=2*3.1415926/fs;
 {
 DFT
 X[k]=sum(n=0;N-1; x[n]*exp(-2*pi*j*k*n/N) ), k=0,...,N-1
 IDFT
 x[n]=(1/N)*sum(k=0;N-1;X[k]*exp(2*pi*k*n/N) ), n=0,...,N-1
 100*10^-6*500
 }
 
label1:
 
 
//cidft
 writeln(' Open hcoefs1.txt for writing coeffs h[n] ');
   AssignFile(fp1, 'hcoefs1.txt') ;
 
   // Rewrite(fp1);
   // Append(fp1);
     if FileExists('hcoefs1.txt') then Append(fp1)
    else Rewrite(fp1);
 
 
 
 writeln(fp1,   fs,' ', Num );
 for  n:=0 to  Num-1 do
  begin
  Re_x[n]:=0;
  Im_x[n]:=0;
  for k:=0 to Num-1 do
  begin
   angle:=2*M_PI*k*n/Num;
        //Uoutp[w]/Uinp[w]   exp(j( fi out[w]-fi inp[w]) )
   Re_H[k]:=abs_H[k]*cos(arg_H[k]);
   Im_H[k]:=abs_H[k]*sin(arg_H[k]);
    Re_x[n] := Re_x[n]+  Re_H[k]*cos(angle)-Im_H[k]*sin(angle);
    Im_x[n] := Im_x[n]+  Re_H[k]*sin(angle) + Im_H[k]*cos(angle);
  end;
  Re_x[n]:= Re_x[n]/Num ;
  Im_x[n]:= Im_x[n]/Num ;
 
    //printf("\n n=%d  Re(h(n))=%lf  Im(h(n))=%lf ",n, Re_x[n] ,Im_x[n]  ) ;
    writeln(' n=',n,'   h[n]= ',  Re_x[n]    ) ;
    writeln(fp1,  n,' ', Re_x[n]  ) ;
 end;
 writeln(fp1, ' ' );
 CloseFile (fp1);
 
 writeln( '  Re(h(n)=h[n]), use it to load into FIR  '   ) ;
label3:
 writeln(' Input 0 for exit ');
 readln( key);
 
end;
 
 
 
 
 
begin
  try
 
         main;
 
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Добавлено через 1 час 19 минут
afr.pas

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
program afr;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  Classes, System.SysUtils ,System.Math;
 
 
 
{
float x[N];
float y[N];
 
double my_FIR(double sample_data, int Nf)
//{
  double result = 0;
  for ( int i = Nf - 2 ; i >= 0 ; i-- )
  //{
    x[i + 1] = x[i];
    y[i + 1] = y[i];
 // }
  //x[0] = (double) sample_data;
  //for (int k = 0; k < N; k++)  result = result + x[k]*h[k];
 
  //y[0] = result;
  //return ((double)result);
 
 
//}
 // }
 
 {
  function ArcTan2(const Y, X: Extended): Extended;
 asm
        FLD     Y
        FLD     X
        FPATAN
        FWAIT
end;
   }
 
function  getabs(re: real;  im :real): real;
begin
 result:=sqrt(sqr(re)+sqr(im));
end;
 
function getarg(  re: real;  im :real): real;
var
 res1: real;
begin
 
 if   (re>0)  then res1:=arctan(im/re);
 if  ((re<0)and (im>=0))  then res1:=arctan(im/re)+Pi ;
 if  ((re<0)and (im<0))   then res1:=arctan(im/re)-Pi;
 if  ((re=0)and(im>0))    then res1:=Pi/2 ;
 if  ((re=0)and(im<0))    then res1:=-Pi/2;
 if  ((re=0)and(im=0))    then res1:=0;  { undef }
 
 result:= res1*180/Pi ;
 //getarg:=result;
  //getarg:=   ArcTan2( im,re);
end;
 
 
 
 
 
 
 
 
procedure main;
const
 
  PI= 3.1415926535897932384626433832795 ;
 // NMAX =512
 
var
      NMAX : integer;
      fp,fp1 : TextFile;
        w,t,Num: integer;
         h : array of real;
         h_im : array of real ;
         Re_H : array of real ;
         Im_H : array of real ;
         Re_x : array of real ;
         Im_x : array of real ;
         abs_H : array of real ;
         arg_h : array of real ;
         f  : array of real ;
          angle : real;
          fs,Tn,Tmax :real ;
        str : string;
        key : string;
        k,n : integer ;
 
label
   label_01,label_02,label_03, label1 ;
 begin
 
    writeln('******* h[n] coeffs to AFR ****** ');
 
 
 
 
   writeln (' For input  h(t) from file input "1"');
   writeln (' For manual  input  h(t) input   "0" ');
   readln( key);
    if (key= '0' ) then   goto label_02;
    if (key= '1' ) then   goto label_01;
 
label_01:
 
    writeln(' Open hcoefs.txt for reading h[n] coefficients ');
    writeln(' Press enter to open');
    readln;
    AssignFile(fp,'hcoefs.txt');
    Reset(fp);
    read(fp,  fs );
    read(fp,  Num);
     Nmax:=Num;
       SetLength(h, NMAX);
  SetLength(h_im, NMAX);
  SetLength(Re_H, NMAX);
  SetLength(Im_H, NMAX);
  SetLength(Re_x, NMAX);
  SetLength(Im_x, NMAX);
  SetLength(abs_H, NMAX);
  SetLength(arg_H, NMAX);
  SetLength(f, NMAX);
 
 
 
    Tmax:=Num*1/fs;
   for  n:=0 to  Num-1 do
    begin
     read(fp, k);
     read(fp, h[n]);
    end;
   CloseFile(fp);
 
 goto label_03;
label_02:
 
 
    writeln(' Input fs ,Hz ');
    readln( fs);
    writeln(' Input  number of points ');
    readln(Num);
      Nmax:=Num;
       SetLength(h, NMAX);
  SetLength(h_im, NMAX);
  SetLength(Re_H, NMAX);
  SetLength(Im_H, NMAX);
  SetLength(Re_x, NMAX);
  SetLength(Im_x, NMAX);
  SetLength(abs_H, NMAX);
  SetLength(arg_H, NMAX);
  SetLength(f, NMAX);
 
 
 
 
    Tmax:=Num*1/fs;
    writeln(' Tmax = ' ,Tmax, ' s');
 
    for  n:=0 to  Num-1 do
     begin
     Tn:=n*1/(Num*fs);
     writeln(' T=',Tn,'  s; n =',n,'  ; input h(n): ');
     readln ( h[n]);
     end;
     {
     h[0]=-0.0485469;
     h[1]=+0.0307880;
     h[2]=+0.0678165;
     h[3]=-0.0079250;
     h[4]=-0.0980449;
     h[5]=-0.0384873;
     h[6]=+0.1898828;
     h[7]=+0.4045168;
     h[8]=+0.4045168;
     h[9]=+0.1898828;
     h[10]=-0.0384873;
     h[11]=-0.0980449;
     h[12]=-0.0079250;
     h[13]=+0.0678165;
     h[14]=+0.0307880;
     h[15]=-0.0485469;
    }
 
 
 
label_03:
    writeln(' Fs= ',fs,'Hz');
    writeln(' N=',Num,'  points' );
   for  n:=0 to   Num-1 do
     begin
     Tn:=n*1/(Num*fs);
     writeln(' t=',Tn,'  s; h[t]= ', h[n]);
     end;
 
     writeln(' Input 0 for next ');
     readln( key);
     writeln(' OK. Parsing ... ');
 
   // H(jw)=integr(0;inf;h(tau)*exp(-j*w*tau) ; d tau)
 
   {
   DFT
   X[k]=sum(n=0;N-1; x[n]*exp(-2*pi*j*k*n/N) ), k=0,...,N-1
   IDFT
   x[n]=(1/N)*sum(k=0;N-1;X[k]*exp(2*pi*k*n/N) ), n=0,...,N-1
   }
 
 
 
label1:
   writeln (' Open afrcoefs.txt for reading AFR coefficients ');
   Assign(fp1,'afrcoefs.txt');
    if FileExists('afrcoefs.txt') then Append(fp1)  else Rewrite(fp1);
    writeln(fp1 ,fs,N);
 
    writeln(' Input 0 for continue ');
    readln( key);
 
 
 
    for  k:=0 to Num-1 do
     begin
     Re_H[k]:=0;
     Im_H[k]:=0;
      for n:=0 to Num-1 do
      begin
       angle:=-2*PI*k*n/Num;
       //  Re_H[k] = Re_H[k]+ h[n]*cos(angle) - h_im[n]*sin(angle);
       //  Im_H[k] = Im_H[k]+ h[n]*sin(angle) + h_im[n]*cos(angle);
         Re_H[k] := Re_H[k]+ h[n]*Cos(angle) ;//- h_im[n]*sin(angle);
         Im_H[k] := Im_H[k]+ h[n]*Sin(angle) ;//+ h_im[n]*cos(angle);
      end;
 
 
 
    abs_H[k]:=sqrt( (Re_H[k]*Re_H[k])+(Im_H[k]*Im_H[k])  );
    arg_h[k]:=getarg(Re_H[k],Im_H[k]);
    f[k]:=k*fs/Num;
    writeln(' n=',k,'; f= ',f[k], 'Hz');
    writeln('  |H(jw)|=',abs_H[k] , '; arg(H(jw))=',arg_h[k] ) ;
 
    writeln(fp1,  k,' ', abs_H[k],' ' ,arg_h[k],' ', f[k],' ') ;
   end;
   CloseFile(fp1);
   writeln(' Input 0 for exit ');
   readln(  key);
 
 
 end;
 
 
 
 
 
 
begin
  try
  main;
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Добавлено через 24 минуты
Как сделать аналог функции deconv в матлабе на Дельфи для перехода от полинома H(p) к частному P(p)/Q(p) ?
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
18.08.2018, 09:37  [ТС] 7
Вариант с использование сетки StringGrid
unit1.pas

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;
 
type
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure   GetFirData  ;
      function FIR(  sample_data: real;   Nf: integer;     h : array of real ) : real  ;
 
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
       x :  array of real;
       y :  array of real;
       imax,jmax: integer;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options:=StringGrid1.Options+[goEditing];
 
      StringGrid1.RowCount:=2;
      StringGrid1.ColCount:=4;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=1;
      StringGrid1.Cells[0, 0] := 'b[i]'   ;
      StringGrid1.Cells[1, 0] := 'value'   ;
      StringGrid1.Cells[2, 0] := 'abs(H[i])'   ;
      StringGrid1.Cells[3, 0] := 'arg(H[i])'   ;
 
      StringGrid2.FixedCols:=0;
      StringGrid2.FixedRows:=1;
      StringGrid2.Cells[0, 0] := 'x[i]'   ;
      StringGrid2.Cells[1, 0] := 'value'   ;
       StringGrid2.Options:=StringGrid2.Options+[goEditing];
end;
 
 
 
 
 
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  j  : integer;
  S: string;
begin
     jmax:=StrToInt(Edit1.Text);
   // S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
    StringGrid1.RowCount:=jmax+2;
 
   for j := 0 to jmax  do begin
      S:='b['+IntToStr(j)+']';
      StringGrid1.Cells[0,j+1]:=S;
      StringGrid1.Cells[1,j+1]:='0';
   end;
      StringGrid1.Cells[1,1]:='2,5';
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
    S: string;
begin
        imax:=StrToInt(Edit2.Text);
   // S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
    StringGrid2.RowCount:=imax+2;
 
   for i := 0 to imax  do begin
      S:='x['+IntToStr(i)+']';
      StringGrid2.Cells[0,i+1]:=S;
      S:='y['+IntToStr(i)+']';
      StringGrid2.Cells[2,i+1]:=S;
 
      StringGrid2.Cells[1,i+1]:='0,0';
   end;
      StringGrid2.Cells[1,1]:='1,0';
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
       GetFirData  ;
end;
 
 
 
 
  procedure    TForm1.GetFirData  ;
  var i ,j : integer;
      x1,y1:real;
         h : array of real;
  begin
           SetLength(h  ,jmax);
 
 
        for j:=0 to jmax-1 do
        begin
              h[j]:=StrToFloat(StringGrid1.Cells[1,j+1]);
              // StringGrid1.Cells[3,j+1] := FloatToStr(h[j]) ;
          end;
 
          SetLength(x,jmax+1);
          SetLength(y,jmax+1);
 
      for i:=0 to imax do
      begin
        x1:=StrToFloat(StringGrid2.Cells[1,i+1]);
     //   y1:=x1;
 
      y1:=FIR(  x1,  jmax,     h   );
 
        //StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
        StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
      end;
 
 
  end;
 
 
 
 
 
 
  function TForm1.FIR(  sample_data: real;   Nf: integer;     h : array of real ) : real  ;
  var
    res1: real;
    i,k: integer;
  begin
 
 
 
     res1 := 0;
  for   i := Nf - 2 downto  0 do
  begin
 
    x[i + 1] := x[i];
    y[i + 1] := y[i];
  end;
  x[0] := sample_data;
 
  for   k := 0 to  Nf-1 do
  begin
 
    res1 := res1 + x[k]*h[k];
  end;
  y[0] := res1;
   result:=res1;
  end;
 
end.
Вложения
Тип файла: zip strgrid.zip (128.1 Кб, 5 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
18.08.2018, 09:43  [ТС] 8
Как сделать x[i]; y[i] статическими переменными ( PArrayOfReal , static как в Си++), создавать вместе с другим классом (Filter1: TFilter, Filter1.Init(jmax,h)
y:=Filter1.FIR(x1)), дописав другой модуль , деинициализировать (Filter1.Destroy) ?
0
442 / 371 / 132
Регистрация: 09.09.2011
Сообщений: 1,339
21.08.2018, 11:09 9
USERPC01, вы пишете огромное кол-во сообщений на форуме, но очень сложно понять что вы спрашиваете. Какая-то проблема в формулировке своих мыслей и желаний у Вас.

Напишите что Вы хотите, а не "static как в C++", static может давать совершенно разные эффекты в зависимости где это ключевое слово указано...

Возможно Вы хотите глобальные переменные, возможно переменные класса - как они объявляются написано в документации к компилятору free pascal.

и что такое по Вашему "деинициализировать"??? инициализация - это присваивание начального значения переменной, Вы чего хотите? присвоить переменной случайное значение - это можно рассматривать как некое приведение ее в начальное, "не инициализированное" состояние.
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
23.08.2018, 15:04  [ТС] 10
static массив здесь - висит в памяти процедуры, независимо от ее вызова, пока не вычисляется новый отсчет, учитывает предыдущее состояние фильтра, инициализируется для каждого класса фильтр( в массиве классов фильтров в дальнейшем ) после первого и последующих вычислений семплов, после удаления класса фильтр удаляется деструктором из памяти .

Добавлено через 1 минуту
С переменными класса глючило, может, правильнее их объявлять ? Как правильнее?
0
442 / 371 / 132
Регистрация: 09.09.2011
Сообщений: 1,339
23.08.2018, 22:01 11
Переменные класса не связаны с конкретными экземплярами - объектами. Это натурально статические переменные, которые имеют время жизни от, практически, начала и до конца работы программы - никакими деструкторами не удаляются, но в деструкторе можем переменную класса обнулить и/или если переменная это ссылка на динамическую структуру, то освободить память.

Опять же понятие - "удаление класса" не применимо к паскалю. Есть класс, есть иго инстанс - объект, объект создается в куче, после вызова деструктора, объект уничтожается и память в куче освобождается. С классом и переменными класса в это время ничего не происходит. В зависимости от модификаторов доступа, переменные класса могут изменять, как методы объектов класса либо любой вообще код, если модификатор доступа public.

Добавлено через 6 минут
советую иногда заглядывать в документацию по языку и синтаксису:
https://www.freepascal.org/doc... fsu24.html

Добавлено через 8 минут
опять же очень сложно понять что вы хотите:
Цитата Сообщение от USERPC01 Посмотреть сообщение
static массив здесь - висит в памяти процедуры, независимо от ее вызова
у процедуры нет какой-то "своей" памяти между ее вызовами. Все переменные объявленные внутри процедуры - локальные, память под них выделяется на стеке, как только происходит выход из процедуры, указатель стека возвращается в начальное положение и все эти переменные перестают существовать. если хотите что-бы какое-то состояние существовало между вызовами, то это либо переменные в более глобальном контексте, либо переменные переданные через параметры по ссылке (var, или указатели на переменные в куче). Если процедуры у вас это методы класса, то переменные класса, это хорошее решение.
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 09:19  [ТС] 12
Вариант с классом : не хочет инициализироваться массив x,y,h :

mainform.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
unit mainform;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, FIRfilter ;
 
type
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure   GetFirData  ;
 
 
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  imax,jmax: integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options:=StringGrid1.Options+[goEditing];
 
      StringGrid1.RowCount:=2;
      StringGrid1.ColCount:=4;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=1;
      StringGrid1.Cells[0, 0] := 'b[i]'   ;
      StringGrid1.Cells[1, 0] := 'value'   ;
      StringGrid1.Cells[2, 0] := 'abs(H[i])'   ;
      StringGrid1.Cells[3, 0] := 'arg(H[i])'   ;
 
      StringGrid2.FixedCols:=0;
      StringGrid2.FixedRows:=1;
      StringGrid2.Cells[0, 0] := 'x[i]'   ;
      StringGrid2.Cells[1, 0] := 'value'   ;
      StringGrid2.Options:=StringGrid2.Options+[goEditing];
end;
 
 
 
 
 
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  j  : integer;
  S: string;
begin
     jmax:=StrToInt(Edit1.Text);
   // S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
    StringGrid1.RowCount:=jmax+2;
 
   for j := 0 to jmax  do begin
      S:='b['+IntToStr(j)+']';
      StringGrid1.Cells[0,j+1]:=S;
      StringGrid1.Cells[1,j+1]:='0';
   end;
      StringGrid1.Cells[1,1]:='2,5';
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
    S: string;
begin
        imax:=StrToInt(Edit2.Text);
   // S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
    StringGrid2.RowCount:=imax+2;
 
   for i := 0 to imax  do begin
      S:='x['+IntToStr(i)+']';
      StringGrid2.Cells[0,i+1]:=S;
      S:='y['+IntToStr(i)+']';
      StringGrid2.Cells[2,i+1]:=S;
 
      StringGrid2.Cells[1,i+1]:='0,0';
   end;
      StringGrid2.Cells[1,1]:='1,0';
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
       GetFirData  ;
end;
 
 
 
 
  procedure    TForm1.GetFirData  ;
  var i ,j : integer;
      x1,y1:real;
      h : array of real;
        FIRFilter1 : TFIRParser1 ;
  begin
           SetLength(h  ,jmax);
 
 
        for j:=0 to jmax-1 do
        begin
              h[j]:=StrToFloat(StringGrid1.Cells[1,j+1]);
               StringGrid1.Cells[3,j+1] := FloatToStr(h[j]) ;  //add for test
          end;
 
 
 
          FIRFilter1.Create( jmax , h  );    // здесь ошибка, не хочет инициализироваться, как поменять
 
      for i:=0 to imax do
      begin
        x1:=StrToFloat(StringGrid2.Cells[1,i+1]);
         y1:=FIRFilter1.getFIRsample( x1) ;
         //y1:=x1;   for test string grid without filtering
        //StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
        StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
      end;
 
         FIRFilter1.Destroy;
  end;
 
 
 
 
end.
firfilter.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit FIRfilter;
 
 {$mode objfpc}{$H+}
// {$mode Delphi} {$H+}
 
// {$M+ }    // add to fix costructor error ?
//{$X+ }
 
interface
 
uses
   Classes,  SysUtils  ;
 
type
 
 
  TFirTempData=record
 
       x :  array   of real  ;
       y :  array   of real  ;
       h  : array   of real   ;
       nfir     :  integer ;
   end;
 
 
    TFIRParser1=class //(TObject)
     private
      //var
 
       fir_data : TFirTempData  ;
 
 
 
 
       public
 
             function  getFIRsample(  sample_data: real  ) : real  ;
 
 
      // procedure  Create( n_fir : integer ;  hfir : array of real  );
         constructor Create( n_fir: integer ;  hfir : array of real  );
         destructor  Destroy ;    override;   //
 
 
 
    //  published            //disabled , works with bug needs {$M}
          //constructor Create( Nf: integer ;  hfir : array of real  );
          // property Order: integer read   FirOrder;
 
 
    end;
 
implementation
 // {$R+} ?
 
  //procedure TFIRParser1.Create( n_fir : integer ;  hfir : array of real  );
   constructor TFIRParser1.Create( n_fir: integer ;  hfir : array of real  );
    var
    i : integer;
 
      begin
           fir_data.nfir:=n_fir;
           SetLength(fir_data.x , fir_data.nfir+1);   // здесь ошибка, не хочет инициализироваться, как поменять
           SetLength(fir_data.y , fir_data.nfir+1);
           SetLength(fir_data.h , fir_data.nfir);
 
           for i:=0 to fir_data.nfir do
           begin
           fir_data.x[i] :=0;
           fir_data.y[i] :=0;
           end;
              for i:=0 to fir_data.nfir-1 do
           begin
           fir_data.h[i] :=0;
           end;
 
            for  i:=0 to fir_data.nfir-1 do
            begin
 
            fir_data.h[i]:=hfir[i];
            end;
 
 
      end;
 
   destructor TFIRParser1.Destroy ;
   begin
           fir_data.nfir:=0;
           SetLength(fir_data.x,0);
           SetLength(fir_data.y,0);
           SetLength(fir_data.h ,0);
         //   FreeMem(  );    how to delete firdata
 
          inherited;
   end;
 
 
 
  function TFIRParser1.getFIRsample(  sample_data: real  ) : real  ;
  var
    res1: real;
    i,k : integer;
  begin
  res1 := 0;
  for   i:=fir_data.nfir-2 downto  0 do
  begin
 
    fir_data.x[i + 1] := fir_data.x[i];
    fir_data.y[i + 1] := fir_data.y[i];
  end;
 
  fir_data.x[0] := sample_data;
 
  for   k :=0 to  fir_data.nfir-1 do
  begin
   res1 :=res1+fir_data.x[k]*fir_data.h[k];
  end;
 fir_data.y[0] := res1;
   result:=res1;
  end;
 
 
 
end.
Какие ключи компилятора и подключаемые модули тогда нужны, как переделать на массивы с указателем, как их инициализировать, работать с ними ? Какие ключи компилятора нужны ( {$M+ } для конструктора и деструктора в published,{$X+ }, {$R+ } , другие )?
Файлі с брейкпоинтом в аттаче.
Вложения
Тип файла: zip firfilter.zip (4.45 Мб, 4 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 12:39  [ТС] 13
Пробовал в классе фильтра private с var и без , глючит. С какими директивами компилятора как правильнее на Лазарусе 1.8.4 FPC 3.0.4 win32/win64 ?

Добавлено через 5 минут
В дальнейшем нужно, чтобы создавался массив фильтров,поэтому внутримодульно внеклассово выкладывать массив переменных не надо. А вот про класс -хранитель-записыватель-считыватель массивов вместо структуры-записи можно подумать. Как добавить
Delphi
1
property Order: integer read FirOrder;
, присваивать ему порядок фильтра, как предустанавливать его (не хочет понимать read в published, в дельфи лучше работает) ?

Добавлено через 2 часа 11 минут
Отладка модулей в простой консольной программе(IIR -часть с ошибкой, использовать getFIRpartsample( x ) .

getFIRpartsample и и способ объявления переменных, порядок фильтра исправлен, работает

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
program project1;
 
 
uses
  crt, Classes,  SysUtils  ;
 
type
 
 
  TIIRTempData=record
       xa :  array   of real  ;
       ya :  array   of real  ;
 
       xb :  array   of real  ;
       yb :  array   of real  ;
       hb  : array   of real   ;
       ha  : array   of real   ;
       nfir     :  integer ;
       niir     :  integer ;
   end;
 
   var  iir_data : TIIRTempData  ;
 
 {
 
   N=3, M=3
 
 y[n]:= sum(l=1 to M ; a[l]*y[n-l] )   +sum(k:=0 to N; b[k]*x[n-k]);
 
 }
 
   //constructor  Create( n_fir: integer ; n_iir: integer;  hbiir : array of real ; haiir : array of real );
  procedure  Create( n_fir: integer ; n_iir: integer;  hbiir : array of real ; haiir : array of real );
    var
    i : integer;
 
      begin
           iir_data.nfir:=n_fir;
 
           SetLength(iir_data.xb , iir_data.nfir+1);
           SetLength(iir_data.yb , iir_data.nfir+1);
           SetLength(iir_data.hb , iir_data.nfir+1);
 
            for i:=0 to iir_data.nfir do
           begin
           iir_data.xb[i] :=0;
           iir_data.yb[i] :=0;
           end;
              for i:=0 to iir_data.nfir  do    //
           begin
           iir_data.hb[i] :=0;
 
           end;
 
 
            iir_data.niir:=n_iir;
            SetLength(iir_data.xa , iir_data.niir+1);
            SetLength(iir_data.ya , iir_data.niir+1);
            SetLength(iir_data.ha , iir_data.niir+1);
 
           for  i:=0 to iir_data.nfir  do
            begin
 
            iir_data.hb[i]:=hbiir[i];
            writeln(iir_data.hb[i])  ;
            end;
 
             writeln;
 
            for  i:=0 to iir_data.niir  do
            begin
 
            iir_data.ha[i]:=haiir[i];
            writeln(iir_data.ha[i])  ;
            end;
 
 
      end;
 
   //destructor  Destroy ;
   procedure  Destroy ;
   begin
           iir_data.nfir:=0;
           SetLength(iir_data.xb,0);
           SetLength(iir_data.yb,0);
           SetLength(iir_data.hb ,0);
 
           iir_data.niir:=0;
           SetLength(iir_data.xa,0);
           SetLength(iir_data.ya,0);
           SetLength(iir_data.ha ,0);
 
 
         // inherited;
   end;
 
 
 
  function  getFIRpartsample(  sample_data: real  ) : real  ;
  var
       res1: real;
    i,k : integer;
  begin
  res1 := 0;
  for   i:=iir_data.nfir-1 downto  0 do
  begin
 
    iir_data.xb[i+1] := iir_data.xb[i];
    iir_data.yb[i+1] := iir_data.yb[i];
  end;
 
  iir_data.xb[0] := sample_data;
 
  for   k :=0 to  iir_data.nfir do
  begin
   res1 :=res1+iir_data.xb[k]*iir_data.hb[k];
  end;
  iir_data.yb[0] := res1;
 
   result:=res1;
  end;
 
 
       //warning, bugs
   function  getIIRpartsample(  sample_data: real  ) : real  ;
  var
    res1: real;
    i,k : integer;
  begin
  res1 := 0;
 
  for   i:=iir_data.niir-2 downto  0 do
  begin
           {shifting , z^-1 transform }
    iir_data.xa[i+1] := iir_data.xa[i];
    iir_data.ya[i+1] := iir_data.ya[i];
  end;
  iir_data.ha[0]:=1;
  iir_data.ya[0] :=  sample_data;
 
 
  for   k :=1 to  iir_data.niir  do
  begin
      // res1 :=res1+fir_data.x[k]*fir_data.h[k];
      //res1 :=res1+iir_data.ya[k]*iir_data.ha[k];
      res1 :=res1-iir_data.ya[k]*iir_data.ha[k];
  end;
 
   iir_data.ya[0] :=iir_data.ya[0]+ res1 ;
 
   res1:=iir_data.ya[0];
   result:=res1;
  end;
 
   function  getIIRsample(  xinput: real  ) : real  ;
   var yfir: real;
   begin
 
        yfir:=getFIRpartsample  (xinput)  ;
       // Result:=yfir   ; //for debug
         Result:=getIIRpartsample(yfir)  ;
 
   end;
 
 
 
 
procedure main;
var
  n1,n2 ,i ,ns :integer  ;
  hb: array of real;
  ha: array of real;
  x: array of real;
  y: real;
begin
   n1:=3;
   n2:=3;
 
   ns:=6;
    SetLength(hb,n1+1);
    SetLength(ha,n2+1);
 
 
    SetLength(x,ns);
 
 
   hb[0]:=1;
   hb[1]:=0;
   hb[2]:=0;
   hb[3]:=0;
 
   ha[0]:=1;
   ha[1]:=0;
   ha[2]:=0;
   ha[3]:=0;
 
   x[0]:=1;
   x[1]:=0;
   x[2]:=0;
   x[3]:=0;
   x[4]:=0;
   x[5]:=0;
 
 
 
   writeln('n1=',n1);
   writeln('n2=',n2);
     for i:=0 to n1 do writeln('hb[',i, ']=',hb[i]);
    writeln;
    for i:=0 to n2 do writeln('ha[',i, ']=',ha[i]);
    readln;
    writeln ('Init iir');
    Create(n1,n2, hb , ha);
 
    for i:=0 to ns-1 do
    begin
        writeln;
        write(' i=',i,'  x[i]=',x[i]);
        y:=getIIRsample(  x[i]  ) ;
        write (' ; y=',y);
    end;
   Destroy;
 
end;
 
begin
 
    main;
   readln;
end.
Добавлено через 58 минут
Вариант с формой (IIR-часть не отлажена)


mainform.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
unit mainform;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, IIRfilter ;
 
type
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure   GetFirData  ;
 
 
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  imax,jmaxfir,jmaxiir : integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options:=StringGrid1.Options+[goEditing];
 
      StringGrid1.RowCount:=2;
      StringGrid1.ColCount:=4;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=1;
      StringGrid1.Cells[0, 0] := 'h b[i]'   ;
      StringGrid1.Cells[1, 0] := 'value'   ;
      StringGrid1.Cells[2, 0] := 'h a[i]'   ;
      StringGrid1.Cells[3, 0] := 'value'   ;
 
      StringGrid2.FixedCols:=0;
      StringGrid2.FixedRows:=1;
      StringGrid2.Cells[0, 0] := 'x[i]'   ;
      StringGrid2.Cells[1, 0] := 'value'   ;
      StringGrid2.Options:=StringGrid2.Options+[goEditing];
end;
 
procedure TForm1.Memo1Change(Sender: TObject);
begin
 
end;
 
 
 
 
 
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  j  : integer;
  S: string;
begin
     jmaxfir:=StrToInt(Edit1.Text);
 
     StringGrid1.RowCount:=jmaxfir+2;
 
   for j := 0 to jmaxfir  do
   begin
      S:='b['+IntToStr(j)+']';
      StringGrid1.Cells[0,j+1]:=S;
      StringGrid1.Cells[1,j+1]:='0';
   end;
      StringGrid1.Cells[1,1]:='1';
 
     jmaxiir:=StrToInt(Edit3.Text);
    for j := 0 to jmaxiir  do
      begin
      S:='a['+IntToStr(j)+']';
      StringGrid1.Cells[2,j+1]:=S;
      StringGrid1.Cells[3,j+1]:='0';
     end;
      StringGrid1.Cells[3,1]:='1';
 
 
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
    S: string;
begin
        imax:=StrToInt(Edit2.Text);
 
    StringGrid2.RowCount:=imax+2;
 
   for i := 0 to imax  do begin
      S:='x['+IntToStr(i)+']';
      StringGrid2.Cells[0,i+1]:=S;
      S:='y['+IntToStr(i)+']';
      StringGrid2.Cells[2,i+1]:=S;
 
      StringGrid2.Cells[1,i+1]:='0,0';
   end;
      StringGrid2.Cells[1,1]:='1,0';
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
       GetFirData  ;
end;
 
 
 
 
  procedure    TForm1.GetFirData  ;
  var i ,j : integer;
      x1,y1:real;
      hb : array of real;
      ha : array of real;
        IIRFilter1 : TIIRParser ;
  begin
           SetLength(hb  ,jmaxfir+1);
           SetLength(ha  ,jmaxiir+1);
            Memo1.lines.Add  ('jmax fir='+IntToStr(jmaxfir));
            Memo1.lines.Add  ('jmax iir='+IntToStr(jmaxiir));
 
        for j:=0 to jmaxfir  do
        begin
              hb[j]:=StrToFloat(StringGrid1.Cells[1,j+1]);
               Memo1.lines.Add  ('hb['+IntToStr(j)+']='+FloatToStr(hb[j]));
          end;
 
 
 
        for j:=0 to jmaxiir  do
        begin
               ha[j]:=StrToFloat(StringGrid1.Cells[3,j+1]);
               Memo1.lines.Add  ('ha['+IntToStr(j)+']='+FloatToStr(ha[j]));
          end;
 
 
 
         IIRFilter1.Create( jmaxfir, jmaxiir, hb , ha  );
 
      for i:=0 to imax-1 do
      begin
        x1:=StrToFloat(StringGrid2.Cells[1,i+1]);
          y1:=IIRFilter1.getIIRsample( x1) ;
 
        // for test string grid without filtering
        // y1:=IIRFilter1.getFIRpartsample( x1) ;
        // y1:=x1;
 
        StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
        StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
      end;
 
         // IIRFilter1.Destroy;
  end;
 
 
 
 
end.
IIRfilter.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
unit IIRfilter;
 
 {$mode objfpc}{$H+}
// {$mode Delphi} {$H+}
 
  {$M+ }    // add to fix costructor error ?
 {$X+ }
 
interface
 
 
uses
   Classes,  SysUtils  ;
 
type
 
 
  TIIRTempData=record
       xa :  array   of real  ;
       ya :  array   of real  ;
 
       xb :  array   of real  ;
       yb :  array   of real  ;
       hb  : array   of real   ;
       ha  : array   of real   ;
       nfir     :  integer ;
       niir     :  integer ;
   end;
 
 
 
    TIIRParser=class //( TObject)
     private
 
 
 
 
 
        // function  getFIRpartsample(  sample_data: real  ) : real  ;
         function  getIIRpartsample(  sample_data: real  ) : real  ;
 
       public
         function  getFIRpartsample(  sample_data: real  ) : real  ;
         function  getIIRsample(  xinput: real  ) : real  ;
 
 
         constructor Create( n_fir: integer ; n_iir: integer;  hbiir : array of real ; haiir : array of real );
         Destructor  Destroy ;    override;
 
 
 
    end;
 
implementation
 var
    iir_data : TIIRTempData  ;
 
   constructor  TIIRParser.Create( n_fir: integer ; n_iir: integer;  hbiir : array of real ; haiir : array of real );
    var
    i : integer;
 
      begin
           iir_data.nfir:=n_fir;
 
           SetLength(iir_data.xb , iir_data.nfir+1);
           SetLength(iir_data.yb , iir_data.nfir+1);
           SetLength(iir_data.hb , iir_data.nfir+1);
 
            for i:=0 to iir_data.nfir do
           begin
           iir_data.xb[i] :=0;
           iir_data.yb[i] :=0;
           end;
              for i:=0 to iir_data.nfir  do
           begin
           iir_data.hb[i] :=0;
 
           end;
 
 
            iir_data.niir:=n_iir;
            SetLength(iir_data.xa , iir_data.niir+1);
            SetLength(iir_data.ya , iir_data.niir+1);
            SetLength(iir_data.ha , iir_data.niir+1);
 
           for  i:=0 to iir_data.nfir  do
            begin
 
            iir_data.hb[i]:=hbiir[i];
        
            end;
 
 
 
            for  i:=0 to iir_data.niir  do
            begin
 
            iir_data.ha[i]:=haiir[i];
             
            end;
 
 
      end;   
 
 
 
 
 destructor  TIIRParser.Destroy ;
   
   begin
            //iir_data.nfir:=0;
            SetLength(iir_data.xb,0);
            SetLength(iir_data.yb,0);
            SetLength(iir_data.hb ,0);
 
            //iir_data.niir:=0;
            SetLength(iir_data.xa,0);
            SetLength(iir_data.ya,0);
            SetLength(iir_data.ha ,0);
 
 
          inherited;
   end;    
 
 
 
 
 
  function  TIIRParser.getFIRpartsample(  sample_data: real  ) : real  ;
  var
       res1: real;
    i,k : integer;
  begin
  res1 := 0;
  for   i:=iir_data.nfir-1 downto  0 do
  begin
 
    iir_data.xb[i+1] := iir_data.xb[i];
    iir_data.yb[i+1] := iir_data.yb[i];
  end;
 
  iir_data.xb[0] := sample_data;
 
  for   k :=0 to  iir_data.nfir do
  begin
   res1 :=res1+iir_data.xb[k]*iir_data.hb[k];
  end;
  iir_data.yb[0] := res1;
 
   result:=res1;
  end;      
 
 
 
 
 
   //warning, bugs
   function  TIIRParser.getIIRpartsample(  sample_data: real  ) : real  ;
  var
    res1: real;
    i,k : integer;
  begin
  res1 := 0;
                                //здесь баги или проверить 
  for   i:=iir_data.niir-2 downto  0 do
  begin
           {shifting , z^-1 transform }
    iir_data.xa[i+1] := iir_data.xa[i];
    iir_data.ya[i+1] := iir_data.ya[i];
  end;
  //здесь баги или проверить 
  iir_data.ha[0]:=1;
  iir_data.ya[0] :=  sample_data;
 
 
  for   k :=1 to  iir_data.niir  do
  begin
      // res1 :=res1+fir_data.x[k]*fir_data.h[k];
      //res1 :=res1+iir_data.ya[k]*iir_data.ha[k];
      res1 :=res1-iir_data.ya[k]*iir_data.ha[k];
  end;
                           //здесь баги или проверить правильность логики (ошибка) 
   iir_data.ya[0] :=iir_data.ya[0]+ res1 ;
 
   res1:=iir_data.ya[0];
   result:=res1;
  end;     
 
 
   function  TIIRParser.getIIRsample(  xinput: real  ) : real  ;
   var yfir: real;
   begin
 
        yfir:=getFIRpartsample  (xinput)  ;
         Result:=yfir   ; //for debug
       // Result:=getIIRpartsample(yfir)  ;
 
   end;   
 
  
 
end.
Работало .исправлена размерность массива .
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 14:02  [ТС] 14
Проект с IIR-фильтром работает, переименовываю методы и класс, адаптирую вызов , глючит конструктор , выходит в ассемблер . Папки в аттаче .
mainform.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
unit mainform;
 
{$mode objfpc}{$H+}
{$M+ }
{$X+ }
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, FIRfilter ;
 
type
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure GetFirData  ;
 
 
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  imax, jmaxfir  : integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options:=StringGrid1.Options+[goEditing];
      StringGrid1.RowCount:=2;
      StringGrid1.ColCount:=4;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=1;
      StringGrid1.Cells[0, 0] := 'h b[i]'   ;
      StringGrid1.Cells[1, 0] := 'value'   ;
 
 
      StringGrid2.FixedCols:=0;
      StringGrid2.FixedRows:=1;
      StringGrid2.Cells[0, 0] := 'x[i]'   ;
      StringGrid2.Cells[1, 0] := 'value'   ;
      StringGrid2.Options:=StringGrid2.Options+[goEditing];
end;
 
 
 
 
 
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  j  : integer;
  S: string;
begin
     jmaxfir:=StrToInt(Edit1.Text);
 
     StringGrid1.RowCount:=jmaxfir+2;
 
   for j := 0 to jmaxfir  do
   begin
      S:='b['+IntToStr(j)+']';
      StringGrid1.Cells[0,j+1]:=S;
      StringGrid1.Cells[1,j+1]:='0';
   end;
      StringGrid1.Cells[1,1]:='1';
 
 
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 
end;
 
 
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
    S: string;
begin
        imax:=StrToInt(Edit2.Text);
 
    StringGrid2.RowCount:=imax+2;
 
   for i := 0 to imax-1  do begin
      S:='x['+IntToStr(i)+']';
      StringGrid2.Cells[0,i+1]:=S;
      S:='y['+IntToStr(i)+']';
      StringGrid2.Cells[2,i+1]:=S;
 
      StringGrid2.Cells[1,i+1]:='0';
   end;
      StringGrid2.Cells[1,1]:='1';
end;
 
procedure    TForm1.GetFirData  ;
 var
       i ,j1 : integer;
       x1,y1:real;
       hb : array of real;
 
       FIRFilter : TFIRParser ;
 begin
 
           SetLength(hb  ,jmaxfir+1);
 
            Memo1.lines.Add  ('jmax fir='+IntToStr(jmaxfir));
 
 
       for j1:=0 to jmaxfir  do
        begin
              hb[j1]:=StrToFloat(StringGrid1.Cells[1,j1+1]);
               Memo1.lines.Add  ('hb['+IntToStr(j1)+']='+FloatToStr(hb[j1]));
         end;
 
      FIRFilter.Create( jmaxfir , hb );
 
     for i:=0 to imax-2 do
     begin
       x1:=0; //StrToFloat(StringGrid2.Cells[1,i+1]);
      // Memo1.lines.Add  ('x['+IntToStr(i)+']='+FloatToStr(x1));
        // y1:=FIRFilter1.getFIRsample( x1 )  ;
 
       // for test string grid without filtering
 
        y1:=0;//x1;
 
   //    StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
     //  StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
     end;
 
        // FIRFilter1.Destroy;
 end;
 
 
 
procedure TForm1.Button4Click(Sender: TObject);
begin
       GetFirData  ;
end;
 
 
 
 
 
 
 
 
 
 
end.

firfilter.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
unit FIRfilter;
 
 {$mode objfpc}{$H+}
// {$mode Delphi} {$H+}
 
 
  {$M+ }
  {$X+ }
interface
 
uses
   Classes,  SysUtils  ;
 
 
type
 
 
  TFIRTempData=record
      
       xb :  array   of real  ;
       yb :  array   of real  ;
       hb  : array   of real   ;
       nfir  :  integer ;
        
   end;  
 
 
    TFIRParser =class
 
       private
 
 
       public
          
         function    getFIRpartsample( sample_data: real  ) : real  ;
         function    getFIRsample(  xinput: real  ) : real  ;
 
        constructor  Create( n_fir: integer ;  hb_fir : array of real  );
         Destructor  Destroy ;    override;
  
 
 
    end;
 
   
implementation
 
 
 var  
 fir_data : TFIRTempData ;
 
 
 
 
  constructor TFIRParser.Create( n_fir : integer ;  hb_fir : array of real  );
    var
    i : integer;
 
      begin
           fir_data.nfir:=n_fir;
 
           SetLength(fir_data.xb , fir_data.nfir+1);
           SetLength(fir_data.yb , fir_data.nfir+1);
           SetLength(fir_data.hb , fir_data.nfir+1);
 
            for i:=0 to fir_data.nfir  do
           begin
           fir_data.xb[i] :=0;
           fir_data.yb[i] :=0;
 
           end;
 
             for i:=0 to fir_data.nfir  do begin fir_data.hb[i] :=0; end;
 
             for  i:=0 to fir_data.nfir  do begin fir_data.hb[i]:=hb_fir[i]; end;
 
 
 
      end;    
 
 
 
   destructor TFIRParser.Destroy ;
 
   begin
            //fir_data.nfir:=0;
            SetLength(fir_data.xb,0);
            SetLength(fir_data.yb,0);
            SetLength(fir_data.hb,0);
          inherited;
   end; 
 
 
 
 
  function  TFIRParser.getFIRpartsample(  sample_data: real  ) : real  ;
  var
     res1: real;
    i,k : integer;
  begin
  res1 := 0;
  for   i:=fir_data.nfir-1 downto  0 do
  begin
 
    fir_data.xb[i+1] := fir_data.xb[i];
    fir_data.yb[i+1] := fir_data.yb[i];
  end;
 
  fir_data.xb[0] := sample_data;
 
  for   k :=0 to  fir_data.nfir do
  begin
   res1 :=res1+fir_data.xb[k]*fir_data.hb[k];
  end;
  fir_data.yb[0] := res1;
 
   result:=res1;
  end;            
 
   
   function  TFIRParser.getFIRsample(  xinput: real  ) : real  ;
   var yfir: real;
   begin
 
         yfir:=getFIRpartsample  (xinput)  ;
         Result:=yfir   ; //for debug
 
 
   end;
 
end.
Вложения
Тип файла: zip firfilter.zip (4.45 Мб, 5 просмотров)
Тип файла: zip iirfilter.zip (4.46 Мб, 5 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 14:07  [ТС] 15
Пробовал в главном модуле с {$M+ } {$X+ }, тоже глючит .

Добавлено через 1 минуту
Как внести var fir_data : TFIRTempData ; внутри класса ? Среда глючит, не размещается класс в памяти. Может, версия компилятора?

Добавлено через 55 секунд
Добавил мемо окно до конструктора класса работает, дальше глючит .(Винда Win7 x64)
0
442 / 371 / 132
Регистрация: 09.09.2011
Сообщений: 1,339
24.08.2018, 14:11 16

Не по теме:

судя по проскакивающей i в тексте, понятно что скорее всего с украины, так что ошибки в грамматики понятны - не будем к ним придираться, но ошибки изложения мысли... надо стараться излагать свои мысли понятным языком. Не спешить вываливать портянки кода. Подумать как сделать так что-бы стороннему человеку было понятно.



что касается сообщения https://www.cyberforum.ru/post12857857.html достаточно привести вот этот фрагмент:

Delphi
1
2
3
4
5
6
7
8
9
10
{...}
procedure    TForm1.GetFirData  ;
  var i ,j : integer;
      x1,y1:real;
      h : array of real;
        FIRFilter1 : TFIRParser1 ;
  begin
  {...}
    FIRFilter1.Create( jmax , h  );    // здесь ошибка, не хочет инициализироваться, как поменять
  {...}
здесь ошибка синтаксиса, надо так:
Delphi
1
FIRFilter1:= TFIRParser1.Create( jmax , h  );

вызывать напрямую деструктор считается не очень хорошим стилем, вместо:
Delphi
1
  FIRFilter1.Destroy;
лучше использовать:
Delphi
1
FIRFilter1.Free;
а еще лучше сразу обнулять указатель:
Delphi
1
2
3
4
{...}
uses {...}, sysutils;
{...}
  FreeAndNil(FIRFilter1);
почему так лучше делать прочитай в любой книге по delphi
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 14:51  [ТС] 17
Code
1
FIR1.Free, Constructor,Destructor, published , FIR1:= TFIRParser.Create( jmax , h  );
у меня не пошло . Идет следующее
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
unit mainform;
 
{$mode objfpc}{$H+}
{$M+ }
{$X+ }
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, FIRfilter ;
 
type
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure GetFirData  ;
 
 
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  imax, jmaxfir  : integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options:=StringGrid1.Options+[goEditing];
      StringGrid1.RowCount:=2;
      StringGrid1.ColCount:=4;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=1;
      StringGrid1.Cells[0, 0] := 'h b[i]'   ;
      StringGrid1.Cells[1, 0] := 'value'   ;
 
 
      StringGrid2.FixedCols:=0;
      StringGrid2.FixedRows:=1;
      StringGrid2.Cells[0, 0] := 'x[i]'   ;
      StringGrid2.Cells[1, 0] := 'value'   ;
      StringGrid2.Options:=StringGrid2.Options+[goEditing];
end;
 
 
 
 
 
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  j  : integer;
  S: string;
begin
     jmaxfir:=3;
     jmaxfir:=StrToInt(Edit1.Text);
 
     StringGrid1.RowCount:=jmaxfir+2;
 
   for j := 0 to jmaxfir   do
   begin
      S:='b['+IntToStr(j)+']';
      StringGrid1.Cells[0,j+1]:=S;
      StringGrid1.Cells[1,j+1]:='0';
   end;
      StringGrid1.Cells[1,1]:='1';
 
 
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 
end;
 
 
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
    S: string;
begin
        imax:=StrToInt(Edit2.Text);
 
    StringGrid2.RowCount:=imax+2;
 
   for i := 0 to imax-1  do
   begin
      S:='x['+IntToStr(i)+']';
      StringGrid2.Cells[0,i+1]:=S;
      S:='y['+IntToStr(i)+']';
      StringGrid2.Cells[2,i+1]:=S;
 
      StringGrid2.Cells[1,i+1]:='0';
   end;
      StringGrid2.Cells[1,1]:='1';
end;
 
procedure    TForm1.GetFirData  ;
 var
       i ,j1 : integer;
       x1,y1:real;
       hb : array of real;
 
       FIR1 : TFIRParser  ;
 begin
 
           SetLength(hb  ,jmaxfir+1);
 
           // Memo1.lines.Add  ('jmax fir='+IntToStr(jmaxfir));
 
 
       for j1:=0 to jmaxfir  do
        begin
              hb[j1]:=0;
              hb[j1]:=StrToFloat(StringGrid1.Cells[1,j1+1]);
               //Memo1.lines.Add  ('hb['+IntToStr(j1)+']='+FloatToStr(hb[j1]));
         end;
 
    FIR1.Create( jmaxfir  , hb );
 
     for i:=0 to imax-2 do
     begin
       x1:= StrToFloat(StringGrid2.Cells[1,i+1]);
      // Memo1.lines.Add  ('x['+IntToStr(i)+']='+FloatToStr(x1));
       y1:=FIR1.getFIRsample( x1 )  ;
 
       // for test string grid without filtering
 
       // y1:= x1;
 
       StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
      StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
     end;
        //FIR1.Free;
 
         //  FIR1.Destroy;
 end;
 
 
 
procedure TForm1.Button4Click(Sender: TObject);
begin
       GetFirData  ;
end;
 
 
 
 
 
 
 
 
 
 
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
unit FIRfilter;
 
 {$mode objfpc}{$H+}
// {$mode Delphi} {$H+}
 
 
 //  {$M+ }
  // {$X+ }
interface
 
uses
   Classes,  SysUtils  ;
 
 
type
 
 
  TFIRTempData=record
      
       xb :  array   of real  ;
       yb :  array   of real  ;
       hb  : array   of real   ;
       nfir  :  integer ;
        
   end;  
 
 
    TFIRParser =class
 
       private
 
 
       public
 
          procedure  Create( n_fir : integer ;  hb_fir : array of real  );
        // constructor  Create( n_fir : integer ;  hb_fir : array of real  );
 
         Destructor  Destroy ;    override;
         function    getFIRpartsample( sample_data: real  ) : real  ;
         function    getFIRsample(  xinput: real  ) : real  ;
 
 
  
 
 
    end;
 
   
implementation
      var
               fir_data : TFIRTempData ;
 
 
 
 
 
   procedure  TFIRParser.Create( n_fir : integer ;  hb_fir : array of real  );
 // constructor TFIRParser.Create( n_fir : integer ;  hb_fir : array of real  );
    var
    i : integer;
 
      begin
           fir_data.nfir:=n_fir;
 
           SetLength(fir_data.xb , fir_data.nfir+1);
           SetLength(fir_data.yb , fir_data.nfir+1);
           SetLength(fir_data.hb , fir_data.nfir+1);
 
            for i:=0 to fir_data.nfir   do
           begin
           fir_data.xb[i] :=0;
           fir_data.yb[i] :=0;
 
           end;
 
              for  i:=0 to fir_data.nfir   do begin fir_data.hb[i] :=0; end;
 
              for  i:=0 to fir_data.nfir  do begin fir_data.hb[i]:=hb_fir[i]; end;
 
 
 
      end;    
 
 
 
   Destructor TFIRParser.Destroy ;
 
   begin
            //fir_data.nfir:=0;
            SetLength(fir_data.xb,0);
            SetLength(fir_data.yb,0);
            SetLength(fir_data.hb,0);
          inherited;
   end; 
 
 
 
 
  function  TFIRParser.getFIRpartsample(  sample_data: real  ) : real  ;
  var
     res1: real;
    i,k : integer;
  begin
  res1 := 0;
  for   i:=fir_data.nfir-1 downto  0 do
  begin
 
    fir_data.xb[i+1] := fir_data.xb[i];
    fir_data.yb[i+1] := fir_data.yb[i];
  end;
 
  fir_data.xb[0] := sample_data;
 
  for   k :=0 to  fir_data.nfir do
  begin
   res1 :=res1+fir_data.xb[k]*fir_data.hb[k];
  end;
  fir_data.yb[0] := res1;
 
   result:=res1;
  end;            
 
   
   function  TFIRParser.getFIRsample(  xinput: real  ) : real  ;
   var yfir: real;
   begin
 
         yfir:=getFIRpartsample  (xinput)  ;
         Result:=yfir   ; //for debug
 
 
   end;
 
end.
Это на лазарусе . Дестуктор плохо работает.Это в Дельфи может работать. На одну процедуру можно упростить.
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 14:53  [ТС] 18
Проект в аттаче, запускаю -немного глючит
Вложения
Тип файла: zip firfilter.zip (4.45 Мб, 2 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 16:04  [ТС] 19
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure    TForm1.GetFirData  ;
 var
       i ,j1 : integer;
       x1,y1:real;
       hb : array of real;
 
       FIR1 : TFIRParser  ;
 begin
         //FreeAndNil(FIR1);
           SetLength(hb  ,jmaxfir+1);
 
           // Memo1.lines.Add  ('jmax fir='+IntToStr(jmaxfir));
 
 
       for j1:=0 to jmaxfir  do
        begin
              hb[j1]:=0;
              hb[j1]:=StrToFloat(StringGrid1.Cells[1,j1+1]);
               //Memo1.lines.Add  ('hb['+IntToStr(j1)+']='+FloatToStr(hb[j1]));
         end;
 
       FIR1.Create( jmaxfir  , hb );
 
     for i:=0 to imax-2 do
     begin
       x1:= StrToFloat(StringGrid2.Cells[1,i+1]);
      // Memo1.lines.Add  ('x['+IntToStr(i)+']='+FloatToStr(x1));
       y1:=FIR1.getFIRsample( x1 )  ;
 
       // for test string grid without filtering
 
       // y1:= x1;
 
       StringGrid2.Cells[2,i+1]:='y['+IntToStr(i)+']';
       StringGrid2.Cells[3,i+1]:=FloatToStr(y1);
     end;
        //FIR1.Free;
 
         //  FIR1.Destroy;
 end;
Так в Лазарусе работает (lazarus-1.8.4-fpc-3.0.4-win64.exe, lazarus-1.8.4-fpc-3.0.4-win32.exe ) . Это в Дельфи иначе .

Добавлено через 10 минут
Как правильнее записывать коэффициенты, чтобы они подходили из Матлаба
Code
1
2
3
     res1 :=res1+iir_data.ya[k]*iir_data.ha[k]; 
    или
      res1 :=res1-iir_data.ya[k]*iir_data.ha[k];
Как исправить функционирование рекурсивной части до соответствия уравнению
Code
1
2
3
4
 
   N=3, M=3
 
 y[n]:= sum(l=1 to M ; a[l]*y[n-l] )   +sum(k:=0 to N; b[k]*x[n-k]);
и матлабовскому представлению знаков a[l] ?
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
24.08.2018, 16:22  [ТС] 20
В книге Куприянов М.С., Матюшкин Б.Д. - Цифровая обработка Сигналов 1999, с. 331-333 альтернативное представление в отличие от ece2610_chap8.pdf альтернативное представление коэффициентов( более обычное, с минусом).
Миниатюры
FIR and spectrum tools   FIR and spectrum tools  
Вложения
Тип файла: pdf ece2610_chap8.pdf (484.9 Кб, 3 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.08.2018, 16:22
Помогаю со студенческими работами здесь

Кассеты / ZX Spectrum
Доброго времени суток! Простите за дебильный вопрос, но всё же: можно ли подружить вот такой КПК HP 95LX ...

bass spectrum
Зашкаливает спектрум, смена высоты не помогает, какая команда отвечает за &quot;чувствительность&quot; спектрума?

Игры на ZX-Spectrum
У кого было это чудо? :) И любимые игры на нем?

Эмулятор ZX Spectrum на STM32f4
Написал эмулятор процессора Z80. Использовал отладочную плату STM32f4-discovery, к ней подключен LCD по FSMC. К PA(входы) и PC(выходы)...

Задача spread spectrum
A serial search should be organized with a constant dwell time Td =2 ms. The discrete signal to be searched occupies bandwidth 1 MHz and...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Введение в Dapr для разработчиков .NET
UnmanagedCoder 18.03.2025
Разработка распределенных систем никогда не была настолько востребованной и одновременно такой сложной. Если вы . NET разработчик, то наверняка сталкивались с необходимостью жонглировать обнаружением. . .
Собеседование по Spring Boot: продвинутые вопросы и ответы
Javaican 18.03.2025
Собеседования на позиции старших разработчиков и архитекторов требуют глубокого понимания внутренних механизмов Spring Boot, нюансов конфигурирования, подходов к оптимизации и построению сложных. . .
Перечисления в TypeScript: использование и лучшие практики
run.dev 18.03.2025
Пишете код и устали от разбросанных по проекту "волшебных" строк и чисел? Знакомая ситуация: где-то в глубине кода притаилась строка "ADMIN", а в другом месте используется "admin". И вот уже. . .
Фишки Kotlin, которые все любят
Javaican 18.03.2025
Помню, как скептически относился к появлению "ещё одного языка для JVM" — мол, зачем нам что-то новое, когда есть Java? Но первый же проект на Kotlin заставил меня пересмотреть свое мнение. Код стал. . .
Списки и кортежи в Python: различия, особенности, применение
py-thonny 18.03.2025
Если вы когда-нибудь писали код на Python, то наверняка сталкивались с конструкциями вида или ('имя', 25, 'инженер'). Это и есть списки и кортежи — последовательности, хранящие упорядоченные наборы. . .
Интеграция JavaScript в Haskell
golander 18.03.2025
Ключевая особенность нового JS-бэкенда GHC — возможность создавать колбэки из JavaScript в Haskell-код. Это открывает дорогу разработке полноценных браузерных приложений, позволяя реагировать на. . .
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru