?? firproga.bas
字號(hào):
10 REM *** Kaiser Window Program Module ***
20 REM
30 REM This program module will generate the necessary FIR coefficients
40 REM using the Kaiser window sequence. The user can then define the
50 REM output path to either the screen, printer, or an external file
60 REM which can be merged with a FIR program to implement the filter.
70 REM
80 DIM C(256),H(256),FACT(256),WK(256),T(256),CHEX$(256),CARY(256)
90 PI = 3.1415927#
100 CLS
110 REM
120 REM *** Generate filter type menu ***
130 REM
140 LOCATE 4
150 PRINT TAB(11);"*** FIR COEFFICIENT GENERATION USING THE KAISER WINDOW ***"
160 LOCATE 8
170 PRINT TAB(22);"Selections:":PRINT
180 PRINT TAB(33);"1....LOWPASS":PRINT
190 PRINT TAB(33);"2....HIGHPASS":PRINT
200 PRINT TAB(33);"3....BANDPASS":PRINT
210 PRINT TAB(33);"4....BANDSTOP":PRINT
220 REM
230 PRINT TAB(33);"5....Exit back to Main Menu":PRINT
240 INPUT " Enter desired filter type (number only) --> ",TYPE
250 IF TYPE = 5 THEN LOAD "firprog.bas",R
260 IF TYPE = 1 THEN GOSUB 1290:GOTO 300 'Lowpass prompts routine
270 IF TYPE = 2 THEN GOSUB 1510:GOTO 300 'Highpass prompts routine
280 IF TYPE=3 OR TYPE=4 THEN GOSUB 1730:GOTO 300 'bandpass/stop prompts routine
290 GOTO 100
300 REM
310 REM *** Prompt for general information and output specifications ***
320 REM
330 MES=0 'flag to which error has occured
340 LOCATE 12
350 INPUT " Enter the Sampling Frequency (Fs) in Hz --> ",FSAM
360 IF TYPE=1 THEN FPASS1=0:FSTOP1=0
370 IF TYPE=2 THEN FPASS2=0:FSTOP2=0
380 IF FSAM/2<FPASS1 OR FSAM/2<FPASS2 OR FSAM/2<FSTOP1 OR FSAM/2<FSTOP2 THEN MES=1:GOSUB 4540:GOTO 330 'display error message
390 REM
400 IF TYPE=1 OR TYPE=2 THEN LOCATE 7
410 IF TYPE=3 OR TYPE=4 THEN LOCATE 9
420 PRINT TAB(24);"Sampling Frequency (Fs) =";FSAM;"Hz"
430 LOCATE 12
440 PRINT " "
450 LOCATE 12
460 INPUT " Are the above specifications correct (y/n)? --> ",RES$
470 IF RES$="n" OR RES$="N" THEN 100
480 LOCATE 12
490 PRINT " "
500 REM *** Calculate the Order required ***
510 FCUT2=ABS(FPASS2-FSTOP2)
520 FCUT1=ABS(FPASS1-FSTOP1)
530 IF TYPE=1 THEN DELTAF=FCUT2
540 IF TYPE=2 THEN DELTAF=FCUT1
550 IF TYPE <> 3 AND TYPE <> 4 THEN 570
560 IF FCUT2 < FCUT1 THEN DELTAF = FCUT2 ELSE DELTAF = FCUT1
570 D2=10^(-.05*ATT)
580 D1=(10^(.05*RIP)-1)/(10^(.05*RIP)+1)
590 IF D1 < D2 THEN NUM = D1 ELSE NUM = D2
600 AHP=-20*LOG(NUM)/LOG(10)
610 IF AHP <= 21 THEN D = .9222 ELSE D = (AHP-7.95)/14.36
620 COEFF=INT(2+D*FSAM/DELTAF)
630 IF COEFF/2 = INT(COEFF/2) THEN COEFF=COEFF+1
640 Q=CINT(COEFF-1)/2
650 LOCATE 12
660 PRINT " The calculated # of coefficients required is:";COEFF
670 PRINT
680 PRINT " Enter # of coefficients desired ONLY if greater than";COEFF
690 INPUT " otherwise, press <Enter> to continue --> ",TEMP
700 IF TEMP = 0 THEN 830
710 IF TEMP < COEFF THEN 750
720 COEFF=TEMP
730 Q=(COEFF-1)/2
740 GOTO 830
750 PRINT
760 FOR BLINK=1 TO 10
770 LOCATE 20
780 PRINT TAB(12);"ERROR! : Order will not satisfy specifications - reenter"
790 FOR DELAY=1 TO 100:NEXT DELAY
800 LOCATE 20:PRINT " "
810 NEXT BLINK
820 GOTO 650
830 CLS
840 LOCATE 12
850 PRINT TAB(28);"Please wait ...working"
860 REM *** Compute Coefficients ***
870 REM
880 IF AHP <= 21 THEN ALP = 0 ELSE ALP = (.1102*(AHP-8.7))
890 IF AHP > 21 AND AHP <= 50 THEN ALP=.5842*(AHP-21)^.4+.07886*(AHP-21)
900 FACT(1)=1
910 FOR I=2 TO 30
920 FACT[I] = FACT(I-1)*I
930 NEXT I
940 FOR I=0 TO Q
950 BESS=ALP*SQR(1-(2*I/(COEFF-1))^2)
960 IOBES=1:IOALP=1
970 FOR N = 1 TO 30
980 IOBES = IOBES+(((BESS/2)^(N))/FACT(N))^2
990 IOALP = IOALP+(((ALP/2)^(N))/FACT(N))^2
1000 NEXT N
1010 WK(I) = IOBES/IOALP
1020 NEXT I
1030 REM
1040 IF TYPE = 1 THEN GOSUB 2100:GOTO 1080 'calculate coeffs for lowpass
1050 IF TYPE = 2 THEN GOSUB 2210:GOTO 1080 'calculate coeffs for highpass
1060 IF TYPE = 3 THEN GOSUB 2320:GOTO 1080 'calculate coeffs for bandpass
1070 IF TYPE = 4 THEN GOSUB 2430 'calculate coeffs for bandstop
1080 REM
1090 REM *** Rearrange Coefficients ***
1100 FOR I = 0 TO COEFF
1110 C(I)=H(I) ' C'(i)
1120 T(I)=H(I) ' T(i) is temporary storage for H(i)'s
1130 NEXT I
1140 FOR I=0 TO Q
1150 T(I)=H(Q-I)
1160 NEXT I
1170 FOR I=1 TO Q
1180 T(Q+I)=T(Q-I)
1190 NEXT I
1200 FOR I=0 TO COEFF
1210 H(I)=T(I)
1220 NEXT I
1230 REM *** Convert and Output Coefficients ***
1240 REM
1250 GOSUB 4390 'convert coeffs to hex
1260 REM
1270 GOSUB 2760 'call output routine
1280 REM
1290 REM ======================= Lowpass Prompts Routine =======================
1300 TYPE$="LOWPASS"
1310 CLS
1320 REM
1330 GOSUB 2690 'output filter type
1340 REM
1350 GOSUB 2540 'prompt for AS and AP
1360 REM
1370 LOCATE 12
1380 INPUT " Enter the passband frequency in Hz --> ",FPASS2
1390 LOCATE 12
1400 PRINT " "
1410 LOCATE 5:PRINT TAB(24);"Passband Frequency =";FPASS2;"Hz"
1420 LOCATE 12
1430 INPUT " Enter the stopband frequency in Hz --> ",FSTOP2
1440 IF FSTOP2 <= FPASS2 THEN GOSUB 4540:GOTO 1420 'display error message
1450 LOCATE 12
1460 PRINT " "
1470 LOCATE 6:PRINT TAB(24);"Stopband Frequency =";FSTOP2;"Hz"
1480 RETURN
1490 REM =======================================================================
1500 REM
1510 REM ====================== Highpass Prompts Routine =======================
1520 TYPE$="HIGHPASS"
1530 CLS
1540 REM
1550 GOSUB 2710 'output filter type
1560 REM
1570 GOSUB 2540 'prompt for AS and AP
1580 REM
1590 LOCATE 12
1600 INPUT " Enter the passband frequency in Hz --> ",FPASS1
1610 LOCATE 12
1620 PRINT " "
1630 LOCATE 5:PRINT TAB(24);"Passband Frequency =";FPASS1;"Hz"
1640 LOCATE 12
1650 INPUT " Enter the stopband frequency in Hz --> ",FSTOP1
1660 IF FSTOP1 >= FPASS1 THEN GOSUB 4540:GOTO 1640 'display error message
1670 LOCATE 12
1680 PRINT " "
1690 LOCATE 6:PRINT TAB(24);"Stopband Frequency =";FSTOP1;"Hz"
1700 RETURN
1710 REM =======================================================================
1720 REM
1730 REM =================== Bandpass/stop Prompts routine =====================
1740 REM
1750 IF TYPE=3 THEN TYPE$="BANDPASS" ELSE TYPE$="BANDSTOP"
1760 CLS
1770 REM
1780 GOSUB 2710 'output filter type
1790 REM
1800 GOSUB 2540 'prompt for AS and AP
1810 REM
1820 LOCATE 12
1830 INPUT " Enter the lower passband frequency in Hz --> ",FPASS1
1840 LOCATE 12
1850 PRINT " "
1860 LOCATE 5:PRINT TAB(24);"Lower Passband Frequency =";FPASS1;"Hz"
1870 LOCATE 12
1880 INPUT " Enter the upper passband frequency in Hz --> ",FPASS2
1890 IF FPASS1 >= FPASS2 THEN GOSUB 4540:GOTO 1870 'display error message
1900 LOCATE 12
1910 PRINT " "
1920 LOCATE 6:PRINT TAB(24);"Upper Passband Frequency =";FPASS2;"Hz"
1930 LOCATE 12
1940 INPUT " Enter the lower stopband frequency in Hz --> ",FSTOP1
1950 IF TYPE=3 THEN IF FSTOP1>=FPASS1 OR FSTOP1>=FPASS2 THEN GOSUB 4540 : GOTO 1930 'display error message
1960 IF TYPE=4 THEN IF FSTOP1<=FPASS1 OR FSTOP1>=FPASS2 THEN GOSUB 4540 : GOTO 1930 'display error message
1970 LOCATE 12
1980 PRINT " "
1990 LOCATE 7:PRINT TAB(24);"Lower Stopband Frequency =";FSTOP1;"Hz"
2000 LOCATE 12
2010 INPUT " Enter the upper stopband frequency in Hz --> ",FSTOP2
2020 IF TYPE=3 THEN IF FSTOP2 <= FPASS2 OR FSTOP2 <= FPASS1 OR FSTOP2 <= FSTOP1 THEN GOSUB 4540:GOTO 2000 'display error message
2030 IF TYPE=4 THEN IF FSTOP2 >= FPASS2 OR FSTOP2 <= FPASS1 OR FSTOP2 <= FSTOP1 THEN GOSUB 4540:GOTO 2000 'display error message
2040 LOCATE 12
2050 PRINT " "
2060 LOCATE 8:PRINT TAB(24);"Upper Stopband Frequency =";FSTOP2;"Hz"
2070 RETURN
2080 REM =======================================================================
2090 REM
2100 REM ======================= Kaiser Lowpass Routine ========================
2110 REM
2120 LWCUT=(FPASS2+FSTOP2)/2
2130 H0=2*LWCUT/FSAM
2140 H(0)=H0*WK(0) 'H(0) = C(0)*W(0)
2150 FOR I=1 TO Q
2160 H(I)=H0*((SIN(2*LWCUT*I*PI/FSAM))/(2*LWCUT*I*PI/FSAM))*WK(I)
2170 NEXT I
2180 RETURN
2190 REM =======================================================================
2200 REM
2210 REM ===================== Kaiser Highpass Routine =========================
2220 REM
2230 HWCUT=(FPASS1+FSTOP1)/2
2240 H0=-2*HWCUT/FSAM
2250 H(0)=(H0+1)*WK(0) 'H(0) = C(0)*W(0)
2260 FOR I=1 TO Q
2270 H(I)=H0*((SIN(2*HWCUT*I*PI/FSAM))/(2*HWCUT*I*PI/FSAM))*WK(I)
2280 NEXT I
2290 RETURN
2300 REM =======================================================================
2310 REM
2320 REM ====================== Kaiser Bandpass Routine ========================
2330 REM
2340 FCUT1=FPASS1-DELTAF/2
2350 FCUT2=FPASS2+DELTAF/2
2360 H(0)=(2/FSAM)*(FCUT2-FCUT1)*WK(0)
2370 FOR I=1 TO Q
2380 H(I)=(1/(I*PI))*(SIN((2*PI*I*FCUT2)/FSAM)-(SIN((2*PI*I*FCUT1)/FSAM)))*WK(I)
2390 NEXT I
2400 RETURN
2410 REM =======================================================================
2420 REM
2430 REM ====================== Kaiser Bandstop Routine ========================
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -