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