README.md
1
2liquid-dsp examples
3===================
4
5This directory contains all the examples for interfacing the liquid modules.
6
7 * `agc_crcf_example.c`:
8 Automatic gain control example demonstrating its transient response.
9
10 * `agc_crcf_qpsk_example.c`:
11 Automatic gain control test for data signals with fluctuating signal
12 levels. QPSK modulation introduces periodic random zero-crossings which
13 gives instantaneous amplitude levels near zero. This example tests the
14 response of the AGC to these types of signals.
15
16 * `ampmodem_example.c`:
17 Tests simple modulation/demodulation of the ampmodem (analog amplitude
18 modulator/demodulator) with noise, carrier phase, and carrier frequency
19 offsets.
20
21 * `asgramcf_example.c`:
22 ASCII spectrogram example for complex inputs. This example demonstrates
23 the functionality of the ASCII spectrogram. A sweeping complex sinusoid
24 is generated and the resulting spectral periodogram is printed to the
25 screen.
26
27 * `asgramf_example.c`:
28 ASCII spectrogram example for real-valued input. This example demonstrates
29 the functionality of the ASCII spectrogram for real-valued input siganls.
30 A cosine signal with time-varying frequency is generated and the resulting
31 spectral periodogram is printed to the screen. Because the time signal has
32 no complex component, its spectrum is symmetric.
33
34 * `autocorr_cccf_example.c`:
35 This example demonstrates the autocorr (auto-correlation) object
36 functionality. A random time-domain sequence is generated which exhibits
37 time-domain repetitions (auto-correlation properties), for example:
38 abcdabcdabcd....abcd. The sequence is pushed through the autocorr object,
39 and the results are written to an output file. The command-line arguments
40 allow the user to experiment with the sequence length, number of sequence
41 repetitions, and properties of the auto-correlator, as well as signal-to-
42 noise ratio.
43
44 * `bpacketsync_example.c`:
45
46 * `bpresync_example.c`:
47 This example demonstrates the binary pre-demodulator synchronizer. A random
48 binary sequence is generated, modulated with BPSK, and then interpolated.
49 The resulting sequence is used to generate a bpresync object which in turn
50 is used to detect a signal in the presence of carrier frequency and timing
51 offsets and additive white Gauss noise.
52
53 * `bsequence_example.c`:
54 This example demonstrates the interface to the bsequence (binary sequence)
55 object. The bsequence object acts like a buffer of bits which are stored
56 and manipulated efficiently in memory.
57
58 * `bufferf_example.c`:
59
60 * `cgsolve_example.c`:
61 Solve linear system of equations `Ax = b` using the conjugate-
62 gradient method where A is a symmetric positive-definite matrix.
63 Compare speed to matrixf_linsolve() for same system.
64
65 * `chromosome_example.c`:
66
67 * `compand_cf_example.c`:
68
69 * `compand_example.c`:
70 This example demonstrates the interface to the compand function
71 (compression, expansion). The compander is typically used with the
72 quantizer to increase the dynamic range of the converter, particularly for
73 low-level signals. The transfer function is computed (emperically) and
74 printed to the screen.
75
76 * `complementary_codes_example.c`:
77 This example demonstrates how to generate complementary binary codes
78 in liquid. A pair of codes is generated using the bsequence
79 interface, their auto-correlations are computed, and the result is
80 summed and printed to the screen. The results are also printed to
81 an output file, which plots the sequences and their
82 auto-correlations.
83
84 SEE ALSO: `bsequence_example.c`
85 `msequence_example.c`
86
87 * `cpfskmodem_example.c`:
88
89 * `conversion_example.c`:
90
91 This example demonstrates conversion from complex baseband to a real-valued
92 signal, and then down-conversion back to complex baseband while removing the
93 negative image.
94
95 STEP 1: A signal is generated at complex baseband consisting of narrow-band
96 filtered noise and an offset tone (to show asymmetry in the transmit
97 spectrum).
98
99 STEP 2: The signal is mixed up to a carrier 'fc' (relative to the sampling
100 frequency) and the real-component of the result is retained. This is
101 the DAC output. The spectrum of this signal has two images: one at
102 +fc, the other at -fc.
103
104 STEP 3: The DAC output is mixed back down to complex baseband and the lower
105 image is (mostly) filtered off. Reminants of the lower frequency
106 component are still visible due to the wide-band and low-order
107 filter on the receiver. The received complex baseband signal also
108 has a reduction in power by 2 because half the signal's energy (the
109 negative image) is filtered off.
110
111 * `crc_example.c`:
112 Cyclic redundancy check (CRC) example. This example demonstrates how a
113 CRC can be used to validate data received through un-reliable means (e.g.
114 a noisy channel). A CRC is, in essence, a strong algebraic error
115 detection code that computes a key on a block of data using base-2
116 polynomials. Also available is a checksum for data validation.
117
118 SEE ALSO: `fec_example.c`
119
120 * `cvsd_example.c`:
121 Continuously-variable slope delta example, sinusoidal input. This example
122 demonstrates the CVSD audio encoder interface, and its response to a
123 sinusoidal input. The output distortion ratio is computed, and the
124 time-domain results are written to a file.
125
126 * `dotprod_cccf_example.c`:
127 This example demonstrates the interface to the complex
128 floating-point dot product object (dotprod_cccf).
129
130 * `dotprod_rrrf_example.c`:
131 This example demonstrates the interface to the floating-point dot
132 product object (dotprod_rrrf).
133
134 * `eqlms_cccf_blind_example.c`:
135 This example tests the least mean-squares (LMS) equalizer (EQ) on a
136 signal with an unknown modulation and carrier frequency offset. That
137 is, the equalization is done completely blind of the modulation
138 scheme or its underlying data set. The error estimate assumes a
139 constant modulus linear modulation scheme. This works surprisingly
140 well even more amplitude-modulated signals, e.g. 'qam16'.
141
142 * `eqlms_cccf_block_example.c`:
143 This example tests the least mean-squares (LMS) equalizer (EQ) on a
144 signal with an unknown modulation and carrier frequency offset.
145 Equalization is performed blind on a block of samples and the reulting
146 constellation is output to a file for plotting.
147
148 * `eqlms_cccf_decisiondirected_example.c`:
149 Tests least mean-squares (LMS) equalizer (EQ) on a signal with a known
150 linear modulation scheme, but unknown data. The equalizer is updated
151 using decision-directed demodulator output samples.
152
153 * `eqlms_cccf_example.c`:
154 * `eqrls_cccf_example.c`:
155 * `fct_example.c`:
156
157 * `fec_example.c`:
158 This example demonstrates the interface for forward error-correction (FEC)
159 codes. A buffer of data bytes is encoded and corrupted with several
160 errors. The decoder then attempts to recover the original data set. The
161 user may select the FEC scheme from the command-line interface.
162
163 SEE ALSO: `crc_example.c`
164 `checksum_example.c`
165 `packetizer_example.c`
166
167 * `fec_soft_example.c`:
168 This example demonstrates the interface for forward error-correction
169 (FEC) codes with soft-decision decoding. A buffer of data bytes is
170 encoded before the data are corrupted with at least one error and
171 noise. The decoder then attempts to recover the original data set
172 from the soft input bits. The user may select the FEC scheme from
173 the command-line interface.
174
175 SEE ALSO: `fec_example.c`
176 `packetizer_soft_example.c`
177
178 * `fft_example.c`:
179 This example demonstrates the interface to the fast discrete Fourier
180 transform (FFT).
181
182 SEE ALSO: `mdct_example.c`
183 `fct_example.c`
184
185 * `fftfilt_crcf_example.c`
186
187 Complex FFT-based finite impulse response filter example. This example
188 demonstrates the functionality of firfilt by designing a low-order
189 prototype and using it to filter a noisy signal. The filter coefficients
190 are real, but the input and output arrays are complex. The filter order
191 and cutoff frequency are specified at the beginning, and the result is
192 compared to the regular corresponding firfilt_crcf output.
193
194 SEE ALSO: `firfilt_crcf_example.c`
195
196 * `firdecim_crcf_example.c`:
197 This example demonstrates the interface to the firdecim (finite
198 impulse response decimator) family of objects.
199 Data symbols are generated and then interpolated according to a
200 finite impulse response square-root Nyquist filter. The resulting
201 sequence is then decimated with the same filter, matched to the
202 interpolator.
203
204 SEE ALSO: `firinterp_crcf_example.c`
205
206 * `firdes_kaiser_example.c`:
207 This example demonstrates finite impulse response filter design using a
208 Kaiser window.
209
210 SEE ALSO: `firdespm_example.c`
211
212 * `firdespm_example.c`:
213 This example demonstrates finite impulse response filter design using the
214 Parks-McClellan algorithm.
215
216 SEE ALSO: `firdes_kaiser_example.c`
217
218 * `firfarrow_rrrf_sine_example.c`:
219
220 * `firfilt_rrrf_example.c`:
221
222 * `firfilt_cccf_example.c`:
223 This example demonstrates the finite impulse response (FIR) filter
224 with complex coefficients as a cross-correlator between transmitted
225 and received sequences.
226
227 * `firfilt_crcf_example.c`:
228 Complex finite impulse response filter example. Demonstrates the
229 functionality of firfilt by designing a low-order prototype and using it
230 to filter a noisy signal. The filter coefficients are real, but the
231 input and output arrays are complex. The filter order and cutoff
232 frequency are specified at the beginning.
233
234 * `firhilb_decim_example.c`:
235 Hilbert transform: 2:1 real-to-complex decimator. This example
236 demonstrates the functionality of firhilb (finite impulse response Hilbert
237 transform) decimator which converts a real time series into a complex one
238 with half the number of samples. The input is a real-valued sinusoid of N
239 samples. The output is a complex-valued sinusoid of N/2 samples.
240
241 SEE ALSO: `firhilb_interp_example.c`
242
243 * `firhilb_example.c`:
244
245 * `firhilb_interp_example.c`:
246 Hilbert transform: 1:2 complex-to-real interpolator. This example
247 demonstrates the functionality of firhilb (finite impulse response Hilbert
248 transform) interpolator which converts a complex time series into a real
249 one with twice the number of samples. The input is a complex-valued
250 sinusoid of N samples. The output is a real-valued sinusoid of 2*N
251 samples.
252
253 SEE ALSO: `firhilb_decim_example.c`
254
255 * `firpfbch2_crcf_example.c`:
256 Example of the finite impulse response (FIR) polyphase filterbank
257 (PFB) channelizer with an output rate of 2 Fs / M as an (almost)
258 perfect reconstructive system.
259
260 * `firinterp_crcf_example.c`:
261 This example demonstrates the interp object (interpolator)
262 interface. Data symbols are generated and then interpolated
263 according to a finite impulse response Nyquist filter.
264
265 * `firpfbch_crcf_analysis_example.c`:
266 Example of the analysis channelizer filterbank. The input signal is
267 comprised of several signals spanning different frequency bands. The
268 channelizer downconverts each to baseband (maximally decimated), and
269 the resulting spectrum of each is plotted.
270
271 * `firpfbch_crcf_example.c`:
272 Finite impulse response (FIR) polyphase filter bank (PFB)
273 channelizer example. This example demonstrates the functionality of
274 the polyphase filter bank channelizer and how its output is
275 mathematically equivalent to a series of parallel down-converters
276 (mixers/decimators). Both the synthesis and analysis filter banks
277 are presented.
278
279 * `firpfbch_crcf_synthesis_example.c`:
280 Example of the synthesis channelizer filterbank. Random symbols are
281 generated and loaded into the bins of the channelizer and the
282 time-domain signal is synthesized. Subcarriers around the band
283 edges are disabled as well as those near 0.25 to demonstrate the
284 synthesizer's ability to efficiently notch the spectrum. The results
285 are printed to a file for plotting.
286
287 * `flexframesync_example.c`:
288 This example demonstrates the basic interface to the flexframegen and
289 flexframesync objects used to completely encapsulate raw data bytes
290 into frame samples (nearly) ready for over-the-air transmission. A
291 14-byte header and variable length payload are encoded into baseband
292 symbols using the flexframegen object. The resulting symbols are
293 interpolated using a root-Nyquist filter and the resulting samples are
294 then fed into the flexframesync object which attempts to decode the
295 frame. Whenever frame is found and properly decoded, its callback
296 function is invoked.
297
298 * `flexframesync_reconfig_example.c`:
299 Demonstrates the reconfigurability of the flexframegen and
300 flexframesync objects.
301
302 * `framesync64_example.c`:
303 This example demonstrates the interfaces to the framegen64 and
304 framesync64 objects used to completely encapsulate data for
305 over-the-air transmission. A 24-byte header and 64-byte payload are
306 encoded, modulated, and interpolated using the framegen64 object.
307 The resulting complex baseband samples are corrupted with noise and
308 moderate carrier frequency and phase offsets before the framesync64
309 object attempts to decode the frame. The resulting data are
310 compared to the original to validate correctness.
311
312 SEE ALSO: `flexframesync_example.c`
313
314 * `freqmodem_example.c`:
315
316 * `fskmodem_example.c`:
317 This example demostrates the M-ary frequency-shift keying
318 (MFSK) modem in liquid. A message signal is modulated and the
319 resulting signal is recovered using a demodulator object.
320
321 * `gasearch_example.c`:
322
323 * `gasearch_knapsack_example.c`:
324
325 * `gmskmodem_example.c`:
326
327 * `gradsearch_example.c`:
328
329 * `gradsearch_datafit_example.c`:
330 Fit 3-parameter curve to sampled data set in the minimum
331 mean-squared error sense.
332
333 * `iirdes_analog_example.c`:
334 Tests infinite impulse reponse (IIR) analog filter design. While this
335 example seems purely academic as IIR filters used in liquid are all
336 digital, it is important to realize that they are all derived from their
337 analog counterparts. This example serves to check the response of the
338 analog filters to ensure they are correct. The results of design are
339 written to a file.
340
341 SEE ALSO: `iirdes_example.c`
342 `iirfilt_crcf_example.c`
343
344 * `iirdes_example.c`:
345 Tests infinite impulse reponse (IIR) digital filter design.
346
347 SEE ALSO: `iirdes_analog_example.c`
348 `iirfilt_crcf_example.c`
349
350 * `iirdes_pll_example.c`:
351 This example demonstrates 2nd-order IIR phase-locked loop filter
352 design with a practical simulation.
353
354 SEE ALSO: `nco_pll_example.c`
355 `nco_pll_modem_example.c`
356
357 * `iirfilt_cccf_example.c`:
358 Complex infinite impulse response filter example. Demonstrates the
359 functionality of iirfilt with complex coefficients by designing a
360 filter with specified parameters and then filters noise.
361
362 * `iirfilt_crcf_example.c`:
363 Complex infinite impulse response filter example. Demonstrates the
364 functionality of iirfilt by designing a low-order prototype (e.g.
365 Butterworth) and using it to filter a noisy signal. The filter
366 coefficients are real, but the input and output arrays are complex. The
367 filter order and cutoff frequency are specified at the beginning.
368
369 * `iirinterp_crcf_example.c`:
370 This example demonstrates the iirinterp object (IIR interpolator)
371 interface.
372
373 * `interleaver_example.c`:
374 This example demonstrates the functionality of the liquid interleaver
375 object. Interleavers serve to distribute grouped bit errors evenly
376 throughout a block of data. This aids certain forward error-correction
377 codes in correcting bit errors. In this example, data bits are
378 interleaved and de-interleaved; the resulting sequence is validated to
379 match the original.
380
381 SEE ALSO: `packetizer_example.c`
382
383 * `interleaver_scatterplot_example.c`:
384
385 * `interleaver_soft_example.c`:
386
387 * `kbd_window_example.c`:
388
389 * `lpc_example.c`:
390 This example demonstrates linear prediction in liquid. An input signal
391 is generated which exhibits a strong temporal correlation. The linear
392 predictor generates an approximating all-pole filter which minimizes
393 the squared error between the prediction and the actual output.
394
395 * `matched_filter_example.c`:
396
397 * `math_lngamma_example.c`:
398 Demonstrates accuracy of lngamma function.
399
400 * `mdct_example.c`:
401
402 * `modem_arb_example.c`:
403 This example demonstrates the functionality of the arbitrary modem, a
404 digital modulator/demodulator object with signal constellation points
405 chosen arbitrarily. A simple bit-error rate simulation is then run to
406 test the performance of the modem. The results are written to a file.
407
408 SEE ALSO: `modem_example.c`
409
410 * `modem_example.c`:
411 This example demonstates the digital modulator/demodulator (modem) object.
412 Data symbols are modulated into complex samples which are then demodulated
413 without noise or phase offsets. The user may select the modulation scheme
414 via the command-line interface.
415
416 SEE ALSO: `modem_arb_example.c`
417
418 * `modem_soft_example.c`:
419 This example demonstates soft demodulation of linear
420 modulation schemes.
421
422 * `modular_arithmetic_example.c`:
423 This example demonstates some modular arithmetic functions.
424
425 * `msequence_example.c`:
426 This example demonstrates the auto-correlation properties of a
427 maximal-length sequence (m-sequence). An m-sequence of a certain length
428 is used to generate two binary sequences (buffers) which are then
429 cross-correlated. The resulting correlation produces -1 for all values
430 except at index zero, where the sequences align.
431
432 SEE ALSO: `bsequence_example.c`
433
434 * `msourcecf_example.c`:
435 This example demonstrates generating multiple signal sources simultaneously
436 for testing using the msource (multi-source) family of objects.
437
438 * `msresamp_crcf_example.c`:
439 Demonstration of the multi-stage arbitrary resampler.
440
441 * `msresamp2_crcf_example.c`:
442 Demonstration of the multi-stage half-band resampler.
443
444 * `nco_example.c`:
445 This example demonstrates the most basic functionality of the
446 numerically-controlled oscillator (NCO) object.
447
448 SEE ALSO: `nco_pll_example.c`
449 `nco_pll_modem_example.c`
450
451 * `nco_pll_example.c`:
452 This example demonstrates how the use the nco/pll object
453 (numerically-controlled oscillator with phase-locked loop) interface for
454 tracking to a complex sinusoid. The loop bandwidth, phase offset, and
455 other parameter can be specified via the command-line interface.
456
457 SEE ALSO: `nco_example.c`
458 `nco_pll_modem_example.c`
459
460 * `nco_pll_modem_example.c`:
461 This example demonstrates how the nco/pll object (numerically-controlled
462 oscillator with phase-locked loop) can be used for carrier frequency
463 recovery in digital modems. The modem type, SNR, and other parameters are
464 specified via the command-line interface.
465
466 SEE ALSO: `nco_example.c`
467 `nco_pll_example.c`
468
469 * `nyquist_filter_example.c`:
470 * `ofdmflexframesync_example.c`:
471 * `ofdmframegen_example.c`:
472 * `ofdmframesync_example.c`:
473
474 * `packetizer_example.c`:
475 Demonstrates the functionality of the packetizer object. Data are encoded
476 using two forward error-correction schemes (an inner and outer code)
477 before data errors are introduced. The decoder then tries to recover the
478 original data message.
479
480 SEE ALSO: `fec_example.c`
481 `crc_example.c`
482
483 * `packetizer_soft_example.c`:
484 This example demonstrates the functionality of the packetizer object
485 for soft-decision decoding. Data are encoded using two forward error-
486 correction schemes (an inner and outer code) before noise and data
487 errors are added. The decoder then tries to recover the original data
488 message. Only the outer code uses soft-decision decoding.
489
490 SEE ALSO: `fec_soft_example.c`
491 `packetizer_example.c`
492
493 * `pll_example.c`:
494 Demonstrates a basic phase-locked loop to track the phase of a
495 complex sinusoid.
496
497 * `poly_findroots_example.c`:
498
499 * `polyfit_example.c`:
500 Test polynomial fit to sample data.
501
502 SEE ALSO: `polyfit_lagrange_example.c`
503
504 * `polyfit_lagrange_example.c`:
505 Test exact polynomial fit to sample data using Lagrange interpolating
506 polynomials.
507
508 SEE ALSO: `polyfit_example.c`
509
510 * `qdetector_cccf_example.c`:
511 This example demonstrates the functionality of the qdetector object
512 to detect an arbitrary signal in time in the presence of noise,
513 carrier frequency/phase offsets, and fractional-sample timing
514 offsets.
515
516 * `qpacketmodem_example.c`:
517 This example demonstrates the basic packet modem encoder/decoder
518 operation. A packet of data is encoded and modulated into symbols,
519 channel noise is added, and the resulting packet is demodulated
520 and decoded.
521
522 * `qnsearch_example.c`:
523
524 * `quantize_example.c`:
525
526 * `random_histogram_example.c`:
527 This example tests the random number generators for different
528 distributions.
529
530 * `repack_bytes_example.c`:
531 This example demonstrates the repack_bytes() interface by packing a
532 sequence of three 3-bit symbols into five 2-bit symbols. The
533 results are printed to the screen. Because the total number of bits
534 in the input is 9 and not evenly divisible by 2, the last of the 5
535 output symbols has a zero explicitly padded to the end.
536
537 * `resamp2_cccf_example.c`
538 This example demonstrates the halfband resampler cenetered at the
539 quarter sample rate to split the signal into positive and negative
540 frequency bands. Two distinct narrow-band signals are generated; one
541 at a positive frequency and one at a negative frequency. The resamp2
542 object is run as a filter to separate the two about the zero-
543 frequency center point.
544
545 * `resamp2_crcf_example.c`:
546 This example demonstrates the halfband resampler running as both an
547 interpolator and a decimator. A narrow-band signal is first
548 interpolated by a factor of 2, and then decimated. The resulting RMS
549 error between the final signal and original is computed and printed
550 to the screen.
551
552 * `resamp2_crcf_decim_example.c`:
553 Halfband decimator. This example demonstrates the interface to the
554 decimating halfband resampler. A low-frequency input sinusoid is
555 generated and fed into the decimator two samples at a time, producing one
556 output at each iteration. The results are written to an output file.
557
558 SEE ALSO: `resamp2_crcf_interp_example.c`
559 `decim_rrrf_example.c`
560
561 * `resamp2_crcf_filter_example.c`:
562 Halfband (two-channel) filterbank example. This example demonstrates
563 the analyzer/synthesizer execute() methods for the resamp2_xxxt
564 family of objects.
565
566 NOTE: The filterbank is not a perfect reconstruction filter; a
567 significant amount of distortion occurs in the transition band
568 of the half-band filters.
569
570 * `resamp2_crcf_interp_example.c`:
571 Halfband interpolator. This example demonstrates the interface to the
572 interpolating halfband resampler. A low-frequency input sinusoid is
573 generated and fed into the interpolator one sample at a time, producing
574 two outputs at each iteration. The results are written to an output file.
575
576 SEE ALSO: `resamp2_crcf_decim_example.c`
577 `interp_crcf_example.c`
578
579 * `resamp_crcf_example.c`:
580
581 * `scramble_example.c`:
582 Data-scrambling example. Physical layer synchronization of received
583 waveforms relies on independent and identically distributed underlying
584 data symbols. If the message sequence, however, is '00000....' and the
585 modulation scheme is BPSK, the synchronizer probably won't be able to
586 recover the symbol timing. It is imperative to increase the entropy of
587 the data for this to happen. The data scrambler routine attempts to
588 'whiten' the data sequence with a bit mask in order to achieve maximum
589 entropy. This example demonstrates the interface.
590
591 * `smatrix_example.c`:
592
593 * `spgramcf_example.c`:
594 Spectral periodogram example with complex inputs.
595
596 * `spgramf_example.c`:
597 Spectral periodogram example with real inputs.
598
599 * `symsync_crcf_example.c`:
600 This example demonstrates the basic principles of the symbol timing
601 recovery family of objects, specifically symsync_crcf. A set of random
602 QPSK symbols are generated and interpolated with a timing offset. The
603 resulting signal is run through the symsync_crcf object which applies a
604 matched filter and recovers timing producing a clean constellation.
605
606 * `symsync_crcf_full_example.c`:
607 This example extends that of `symsync_crcf_example.c` by including options
608 for simulating a timing rate offset in addition to just a timing phase
609 error. The resulting output file shows not just the constellation but the
610 time domain sequence as well as the timing phase estimate over time.
611
612 * `symsync_crcf_kaiser_example.c`:
613 This is a simplified example of the symync family of objects to show how
614 symbol timing can be recovered after the matched filter output.
615
616 * `symtrack_cccf_example.c`:
617
618 This example demonstrates how to recover data symbols using the symtrack
619 object. A stream of modulated and interpolated symbols are generated using
620 the symstream object. The resulting samples are passed through a channel
621 to add various impairments. The symtrack object recovers timing, carrier,
622 and other information imparted by the channel and returns data symbols
623 ready for demodulation.
624
625 * `wdelayf_example.c`:
626
627 * `windowf_example.c`:
628 This example demonstrates the functionality of a window buffer (also
629 known as a circular or ring buffer) of floating-point values.
630 Values are written to and read from the buffer using several
631 different methods.
632
633 SEE ALSO: `bufferf_example.c`
634 `wdelayf_example.c`
635
636