remez
所属分类:数学计算
开发工具:Delphi
文件大小:116KB
下载次数:129
上传日期:2005-07-17 16:03:24
上 传 者:
n5735
说明: 我自己改写的Remez,FIR滤波器参数计算程序
(I write in Remez, FIR filter parameter calculation procedures)
文件列表:
remez (0, 2005-07-17)
remez.pas (20001, 2005-07-16)
remez\build.bat (213, 1999-07-18)
remez\Debug (0, 2004-06-17)
remez\filter.c (1732, 1999-07-18)
remez\filter.dat (902, 2003-11-30)
remez\GPL (18342, 1999-07-18)
remez\lex.yy.cpp (43051, 1999-07-18)
remez\LGPL (25747, 1999-07-18)
remez\lowpass.bat (39, 1999-07-18)
remez\lowpass.csv (23718, 1999-07-18)
remez\lowpass.m (7146, 1999-07-18)
remez\lowpass.rem (182, 1999-07-10)
remez\main.cpp (6846, 1999-07-18)
remez\remez.cpp (20144, 1999-07-18)
remez\remez.exe (73728, 1999-07-18)
remez\remez.h (1834, 1999-07-18)
remez\remez.l (2835, 1999-07-18)
remez\remez.tab.cpp (25070, 1999-07-18)
remez\remez.tab.h (290, 1999-07-18)
remez\remez.y (2387, 1999-07-18)
remez\t2d.csv (23649, 2003-11-30)
remez\t2d.m (1398, 2003-11-30)
remez\t2d.rem (177, 2003-11-30)
remez\t2d.rem.bak (181, 2003-11-30)
remez\test.bat (30, 1999-07-18)
remez\test.csv (23582, 1999-07-18)
remez\test.m (1293, 1999-07-18)
remez\test.rem (532, 1999-07-18)
remez\types.h (1184, 1999-07-18)
-------------------------------------------------------------------------
README file for Remez FIR Filter Design Program
Copyright (C) 1999 Jim Ledin (jim@ledin.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-------------------------------------------------------------------------
This program (remez.exe) designs optimal linear phase FIR filters
using filter specifications read from an input file. It is based
on an implementation of the Parks-McClellan equiripple design program
by Jake Janovetz (janovetz@uiuc.edu).
Input file format:
Statements in the input file can be arranged in free format. There
should be at most one of each type of statement {order, bands,
amplitudes}. {type, weights} are optional statements with default
values as specified below.
Numerical values must be in C floating point format except that
no exponents or minus signs are allowed.
Mandatory statements:
order = integer
The filter order. The number of filter coefficients =
order+1.
bands = (number, number) [, (number, number) ...]
Each pair within parentheses contains the lower and upper
band edges, with lower listed first. The frequency is
defined in the range [0,1] where 1 is the Nyquist frequency,
which is half the sampling rate. Bands must be listed
in increasing frequency order. The first band must begin at
0 and the last band must end at 1. The separation between
bands must be greater than zero to allow for a transition
region.
amplitudes = number [, number ...]
Each amplitude goes with the corresponding band in the
band statement. Amplitudes must be >= 0.
Optional statements:
type = bandpass | hilbert | differentiator
defaults to bandpass if this statement is not provided.
weights = number [, number ...]
Each weight goes with the corresponding band in the
bands statement. Weights must be greater than 0. All weights
default to 1 if this statement is not provided.
Comments: Comments can be included in the input file using C/C++ syntax:
// This is a C++ end-of-line comment
/* This is C-style comment */
Example input file (test.rem):
// Lowpass filter example
// Note: type defaults to bandpass & weights default to 1
// This file describes a lowpass filter with a desired amplitude
// of 1 in the frequency range [0, 0.45] and zero in the range
// [0.55, 1]. The range [0.45, 0.55] is a transition region.
// For an 8 KHz sampling rate the Nyquist frequency is 4 Khz and
// the passband will be 0 to 1800 Hertz and the stopband will be
// 2200 to 4000 Hertz.
type = bandpass
weights = 1, 1
order = 22
bands = (0, 0.45), (0.55, 1)
amplitudes = 1, 0
Execute the command file test.bat to process this file.
The filter.dat output file produced by this example is:
#define N 23
static double H[N] =
{
-3.279199345817378200e-002,
-9.447491858515190300e-005,
2.540825979405659000e-002,
-7.219108010618943700e-005,
-3.720689102197431700e-002,
-6.954083711178532800e-005,
5.770408717695533300e-002,
-8.033893***8899294400e-005,
-1.023035371036797900e-001,
-9.592081101169122500e-005,
3.171424233766678100e-001,
4.999104052948560900e-001,
3.171424233766678100e-001,
-9.592081101169122500e-005,
-1.023035371036797900e-001,
-8.033893***8899294400e-005,
5.770408717695533300e-002,
-6.954083711178532800e-005,
-3.720689102197431700e-002,
-7.219108010618943700e-005,
2.540825979405659000e-002,
-9.447491858515190300e-005,
-3.279199345817378200e-002
};
Program operation:
usage: remez filename.rem [freqresp.csv] [filename.m]
filename.rem = Input filter specifications
freqresp.csv = Spreadsheet format frequency response data
filename.m = Filter parameters in Matlab format
C source output file = filter.dat
The filter coefficients are always output to the file filter.dat. The file
filter.c contains a functional, though not very efficient, FIR filter
implementation that #includes filter.dat.
Executing the command: remez lp.rem lp.csv lp.m
will produce the output files filter.dat, lp.csv and lp.m. lp.csv contains
frequency response data for plotting in a program such as Excel. lp.m is a
Matlab script that defines the filter specifications for use with the Matlab
remez function as: remez(N, F, A, W). It also contains the computed impulse
response H which can be compared to the output of the remez function.
Note that it is not necessary to generate the .csv or .m files. To just
generate the filter.dat coefficients use the command:
remez lp.rem
Original program README file:
/**************************************************************************
* Parks-McClellan algorithm for FIR filter design (C version)
*-------------------------------------------------
* Copyright (c) 1995,19*** Jake Janovetz (janovetz@uiuc.edu)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*************************************************************************/
DESCRIPTION:
============
The Parks-McClellan program is a filter design program which creates
optimal filters in the sense that there is equirriple in the pass bands
and stop bands of the resulting frequency response.
This version was written for use in another program in which I required
C access to the design routine. Therefore, Matlab's 'remez' function
wouldn't do. I also didn't like all the FORTRAN to C conversions done
because they're impossible to read. This version is based on the original
FORTRAN code and equations presented in Oppenheim & Schafer.
To use the code, simply include all but 'main' in your own code. There
is no front end supplied with this code, but that should be simple to
implement.
If any errors are found, please let me know. I have compared the output
to that of Matlab's 'remez' function and get close (within reasonable
rounding error -- on the order of 1e-13) to the impulse response. However,
I have not exhaustively tested it with a lot of vectors.
Jake
COMPILE INSTRUCTIONS:
=====================
To compile the test program that generates a single filter, but asks for
no input (it truly is a test program), very simply type:
cc -o test test.c remez.c -lm
On a UNIX machine. You may use other compilers (namely gcc), but you
must link the math libraries (-lm). If you have problems compiling on
a system, let me know and I'll see what I can do. The code should be
very portable, though.
Then, you can run the compiled program (test) and watch it generate some
fascinating (!) coefficients.
THANKS:
=======
Thanks to Dr Peter Kootsookos for his help in finding a couple bugs in
the original code.
近期下载者:
相关文件:
收藏者: