forked from gnuradio/gnuradio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.dox
261 lines (197 loc) · 9.35 KB
/
filter.dox
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
/*! \page page_filter Filter Signal Processing Blocks
\section filter_introduction Introduction
This is the gr-filter package. It contains signal processing blocks to
perform filtering operations.
The Python namespace is in gnuradio.filter, which would be normally
imported as:
\code
from gnuradio import filter
\endcode
See the Doxygen documentation for details about the blocks available
in this package. A quick listing of the details can be found in Python
after importing by using:
\code
help(filter)
\endcode
\section filter_dependencies Dependencies
The filter blocks depend on \ref page_fft.
\section filter_usage Usage
There are many filter blocks and kernels in GNU Radio. Filter blocks
are standard GNU Radio blocks that fit into a flowgraph. Filter
kernels are the guts of the filtering operations that are C++ classes
which are designed to be useful within other blocks. The filtering
module also comes with a number of filter design tools.
\subsection filter_kernels Kernels
\li FIR filters (see fir_filter.h): filters that compute finite
impulse response (FIR) filtering in the time domain.
\li FFT filters (see fft_filter.h): filters that compute FIR filtering
in the frequency domain (i.e., fast convolution).
\li FIR filters with internal buffers (see fir_filter_with_buffer.h):
filters that perform time-domain FIR filtering but keep an internal
buffer so the input vectors are not affected or used. This is not as
efficient as the normal FIR filters but can be necessary under certain
conditions.
\li IIR filters (see iir_filter.h): filters that compute infinite
impulse response (IIR) filtering.
\li Single-pole IIR filters (see single_pole_iir.h): a special case of
an IIR filter with a single pole (also known as a moving average
filter).
\li PFB arbitrary resampler (see pfb_arb_resampler.h): performs
arbitrary resampling (i.e., using any real number) using the polyphase
filterbank method. \sa \ref pfb_arb_resampler
\li Polyphase filterbank (see polyphase_filterbank.h): a set of base
classes with standard functions for building many polyphase filterbank
blocks.
\subsection filter_blocks Blocks
<ul>
<li>FIR Filters</li>
<ul>
<li>gr::filter::fir_filter_ccc</li>
<li>gr::filter::fir_filter_ccf</li>
<li>gr::filter::fir_filter_fcc</li>
<li>gr::filter::fir_filter_fff</li>
<li>gr::filter::fir_filter_fsf</li>
<li>gr::filter::fir_filter_scc</li>
</ul>
<li>FFT Filters</li>
<ul>
<li>gr::filter::fft_filter_ccc</li>
<li>gr::filter::fft_filter_fff</li>
</ul>
<li>IIR Filters</li>
<ul>
<li>gr::filter::iir_filter_ffd</li>
</ul>
<li>Single-Pole IIR Filters</li>
<ul>
<li>gr::filter::single_pole_iir_filter_cc</li>
<li>gr::filter::single_pole_iir_filter_ff</li>
</ul>
<li>Polyphase Filterbanks</li>
<ul>
<li>gr::filter::pfb_arb_resampler_ccf</li>
<li>gr::filter::pfb_arb_resampler_fff</li>
<li>gr::filter::pfb_channelizer_ccf</li>
<li>gr::filter::pfb_decimator_ccf</li>
<li>gr::filter::pfb_interpolator_ccf</li>
<li>gr::filter::pfb_synthesizer_ccf</li>
<li>gr::digital::pfb_clock_sync_ccf</li>
<li>gr::digital::pfb_clock_sync_fff</li>
</ul>
</ul>
\subsection filter_design_tools Design Tools
To help build filters, GNU Radio includes a number of design
tools. These tools build standard filters like low pass, high pass,
band pass, etc. There are two main flavors of the filter design tools:
\li Windowed filters (see firdes.h): filters defined as sinc functions
and a window function.
\li Equiripple filters (see optfir.py): filters defined by using the
Parks-McClellen algorithm given a set of conditions.
The GNU Radio filter library also exports the Parks-McClellen
algorithm in both C++ and Python as gr::filter::pm_remez.
The firdes.h filter contains functions to design the following types
of filters (see gr::filter::firdes):
\li gr::filter::firdes::low_pass: defines a low pass filter based on a
pass band bandwidth and transition bandwidth.
\li gr::filter::firdes::low_pass_2: same as the low pass filter with
added argument to set the out-of-band attenuation (in dB).
\li gr::filter::firdes::high_pass: defines a high pass filter based on a
pass band bandwidth and transition bandwidth.
\li gr::filter::firdes::high_pass_2: same as the high pass filter with
added argument to set the out-of-band attenuation (in dB).
\li gr::filter::firdes::band_pass: defines a band pass filter based on the
pass band start and stop frequencies and transition bandwidth.
\li gr::filter::firdes::band_pass_2: same as the band pass filter with
added argument to set the out-of-band attenuation (in dB).
\li gr::filter::firdes::complex_band_pass: defines a complex band pass
filter based on the pass band start and stop frequencies and transition
bandwidth. Returns complex taps for one-sided spectrum.
\li gr::filter::firdes::complex_band_pass_2: same as the complex band
pass filter with added argument to set the out-of-band attenuation (in
dB).
\li gr::filter::firdes::band_reject: defines a band reject filter
based on a stop band bandwidth and transition bandwidth.
\li gr::filter::firdes::band_reject_2: same as the band reject filter
with added argument to set the out-of-band attenuation (in dB).
\li gr::filter::firdes::hilbert: creates a Hilbert transform filter.
\li gr::filter::firdes::root_raised_cosine: creates a root raised
cosine (RRC) pulse shaping filter.
\li gr::filter::firdes::guassian: creates a Gaussian pulse shaping
filter.
\li gr::filter::firdes::window: Returns the window function for the
given window at the given number of taps.
The optfir.py contains a set of Python-only functions that define
equiripple filters using the Parks-McClellen algorithm:
\li low_pass: defines a low pass filter based off the end of the pass
band, the start of the stop band, the pass band ripple, and the stop
band attenuation.
\li band_pass: defines a band pass filter based the end of the first
stop band, the start of the pass band, the end of the pass band, the
start of the second stop band, the pass band ripple, and the stop band
attenuation.
\li complex_band_pass: defines a band pass filter based the end of the first
stop band, the start of the pass band, the end of the pass band, the
start of the second stop band, the pass band ripple, and the stop band
attenuation. Returns complex taps for one-sided spectrum.
\li band_reject: defines a band reject filter based the end of the
first pass band, the start of the stop band, the end of the stop band,
the start of the second pass band, the pass band ripple, and the stop
band attenuation. Unlike the firdes.h band_reject filter, this filter
does not have to be symmetrical.
\li high_pass defines a high pass filter based off the end of the stop
band, the start of the pass band, the pass band ripple, and the stop
band attenuation.
\subsection filter_design Filter Design GUI Tool
GNU Radio has a filter design GUI tool called \b
gr_filter_design. This tool allows us to build filters using the
filter design methods above and look at the results immediately. The
frequency and time domain along with other aspects of the filter like
the phase profile, group delay, the filter taps as a list, impulse
response, and step response. Also displayed is a pole-zero plot.
The filter design tool is useful to provide immediate feedback on the
shape, behavior, and complexity of the filter from the design
parameters. The tool also includes a \b save capability to save the
taps and parameters in a simple comma-separated value (CSV) format.
Furthermore, the filter design program can be called and used for
interaction within a Python program. There are a few ways in which we
can interact with the tool programmatically.
The tool can be simply launched from Python, and when closed, it
returns an object filled with the filter parameters and taps. An
example of this can be found in \b examples/filter/gr_filtdes_api.py.
\code
filtobj = filter_design.launch(sys.argv)
print "Filter Count:", filtobj.get_filtercount()
print "Filter type:", filtobj.get_restype()
print "Filter params", filtobj.get_params()
print "Filter Coefficients", filtobj.get_taps()
\endcode
Another way of using the filter design tool is to give it a callback
function that is called whenever the "Design" button is pressed in the
GUI. The following code comes from the \b
examples/filter/gr_filtdes_callback.py example. Whenever "Design" is
pressed, the "print_params" function is called with the filter
parameters and taps inside of the "filtobj" object.
\code
def print_params(filtobj):
print "Filter Count:", filtobj.get_filtercount()
print "Filter type:", filtobj.get_restype()
print "Filter params", filtobj.get_params()
print "Filter Coefficients", filtobj.get_taps()
app = Qt.QApplication(sys.argv)
main_win = filter_design.launch(sys.argv, print_params)
main_win.show()
app.exec_()
\endcode
Changing one line in the above code allows us to set restrictions on
what type of filter the design tool can build. This concept is shown
in \b examples/filter/gr_filtdes_restrict.py. Here, the filter type is
restricted to using IIR filters.
\code
main_win = filter_design.launch(sys.argv, callback = print_params, restype = "iir")
\endcode
An application running a full GNU Radio flowgraph can actually launch
the filter design tool and have it update a filter while the system is
running. This concept is an extension of the callback function and is
shown in the example \b examples/filter/gr_filtdes_live_upd.py. The
code is not shown here as the full code is quite long.
*/