From 4f95f267cebd41700d83b9a325aa1ec8a504f63d Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Fri, 28 Nov 2014 17:26:39 +0100 Subject: [PATCH] fix formatting, etc. --- README.md | 78 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 776b27d..f4cb33d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ libcsdr ======= -*libcsdr* is a set of simple DSP routines for Software Defined Radio. -It is mostly useful for AM/FM/SSB demodulation and spectrum display. -Feel free to use it in your projects. -Most of the code is available under the permissive BSD license, with some optional parts under GPL. For additional details, see [Licensing]. +*libcsdr* is a set of simple DSP routines for Software Defined Radio. +It is mostly useful for AM/FM/SSB demodulation and spectrum display. +Feel free to use it in your projects. +Most of the code is available under the permissive BSD license, with some optional parts under GPL. For additional details, see licensing. - The package comes with a command-line tool `csdr`, which lets you build DSP processing chains by shell pipes. - The code of *libcsdr* was intended to be easy to follow. @@ -48,7 +48,8 @@ Usage by example - We want to listen to one radio station, but input signal contains multiple stations, and its bandwidth is too large for sending it directly to the FM demodulator. - We shift the signal to the center frequency of the station we want to receive: `-0.17*2400000*0.5 = -204000`, so basically we will listen to the radio station centered at 89504000 Hz. - We decimate the signal by a factor of 10. The rolloff for the FIR filter used for decimation will be 10% of total bandwidth (as of parameter 0.05 is 10% of 0.5). Hamming window will be used for windowed FIR filter design. -- Sample rates look like this: + +Sample rates look like this: 2.4 Msps 240 ksps 48 ksps @@ -134,33 +135,33 @@ You can use these commands on complex streams, too, as they are only interleaved Regarding `csdr`, the first command-line parameter is the name of a function, others are the parameters for the given function. Compulsory parameters are noted as ``, optional parameters are noted as `[parameter]`. Optional parameters have safe defaults, for more info look at the code. -##### `realpart_cf` + realpart_cf It takes the real part of the complex signal, and throws away the imaginary part. -##### `clipdetect_ff` + clipdetect_ff It clones the signal (the input and the output is the same), but it prints a warning on `stderr` if any sample value is out of the -1.0 ... 1.0 range. -##### `limit_ff [max_amplitude]` + limit_ff [max_amplitude] The input signal amplitude will not be let out of the `-max_amplitude ... max_amplitude` range. -##### `gain_ff ` + gain_ff It multiplies all samples by `gain`. -##### `clone` + clone It copies the input to the output. -##### `yes_f [buf_times]` + yes_f [buf_times] It outputs continously the `to_repeat` float number. If `buf_times` is not given, it never stops. Else, after outputing `buf_times` number of buffers (the size of which is stated in the `BUFSIZE` macro), it exits. -##### `shift_math_cc ` + shift_math_cc It shifts the complex spectrum by `rate`. `rate` is a floating point number between -0.5 and 0.5. @@ -168,56 +169,56 @@ It shifts the complex spectrum by `rate`. Internally, a sine and cosine wave is generated to perform this function, and this function uses `math.h` for this purpose, which is quite accurate, but not always very fast. -##### `shift_addition_cc ` + shift_addition_cc Operation is the same as with `shift_math_cc`. Internally, this function uses trigonometric addition formulas to generate sine and cosine, which is a bit faster. (About 4 times on the machine I have tested it on.) -##### `shift_addition_cc_test` + shift_addition_cc_test This function was used to test the accuracy of the method above. -##### `dcblock_ff` + dcblock_ff This is a DC blocking IIR filter. -##### `fastdcblock_ff` + fastdcblock_ff This is a DC blocker that works based on the average of the buffer. -##### `fmdemod_atan_cf` + fmdemod_atan_cf It is an FM demodulator that internally uses the `atan` function in `math.h`, so it is not so fast. -##### `fmdemod_quadri_cf` + fmdemod_quadri_cf It is an FM demodulator that is based on the quadri-correlator method, and it can be effectively auto-vectorized, so it should be faster. -##### `fmdemod_quadri_novect_cf` + fmdemod_quadri_novect_cf It has more easily understandable code than the previous one, but can't be auto-vectorized. -##### `deemphasis_wfm_ff ` + deemphasis_wfm_ff It does de-emphasis with the given RC time constant `tau`. Different parts of the world use different pre-emphasis filters for FM broadcasting. In Europe, `tau` should be chosen as `50e-6`, and in the USA, `tau` should be `75e-6`. -##### `deemphasis_nfm_ff ` + deemphasis_nfm_ff It does de-emphasis on narrow-band FM for communication equipment (e.g. two-way radios). It uses fixed filters so it works only on predefined sample rates, for the actual list of them run: `cat libcsdr.c | grep DNFMFF_ADD_ARRAY` -##### `amdemod_cf` + amdemod_cf It is an AM demodulator that uses `sqrt`. On some architectures `sqrt` can be directly calculated by dedicated CPU instructions, but on others it may be slower. -##### `amdemod_estimator_cf` +amdemod_estimator_cf It is an AM demodulator that uses an estimation method that is faster but less accurate than `amdemod_cf`. -##### `firdes_lowpass_f [window [--octave]]` + firdes_lowpass_f [window [--octave]] Low-pass FIR filter design function to output real taps, with a `cutoff_rate` proportional to the sampling frequency, using the windowed sinc filter design method. `cutoff_rate` can be between 0 and 0.5. @@ -231,40 +232,40 @@ Some functions (below) require the `transition_bw` to be given instead of filter The `--octave` parameter lets you directly view the filter response in `octave`. For more information, look at the [Usage by example] section. -##### `firdes_bandpass_c [window [--octave]]` + firdes_bandpass_c [window [--octave]] Band-pass FIR filter design function to output complex taps. `low_cut` and ` high_cut` both may be between -0.5 and 0.5, and are also proportional to the sampling frequency. Other parameters were explained above at `firdes_lowpass_f`. -##### `fir_decimate_cc [transition_bw [window]]` + fir_decimate_cc [transition_bw [window]] It is a decimator that keeps one sample out of `decimation_factor` samples. To avoid aliasing, it runs a filter on the signal and removes spectral components above `0.5 × nyquist_frequency × decimation_factor`. `transition_bw` and `window` are the parameters of the filter. -##### `rational_resampler_ff [transition_bw [window]]` + rational_resampler_ff [transition_bw [window]] It is a resampler that takes integer values of `interpolation` and `decimation`. The output sample rate will be `interpolation / decimation × input_sample_rate`. `transition_bw` and `window` are the parameters of the filter. -##### `fractional_decimator_ff [transition_bw [window]]` + fractional_decimator_ff [transition_bw [window]] It can decimate by a floating point ratio. `transition_bw` and `window` are the parameters of the filter. -#### `bandpass_fir_fft_cc [window]` + bandpass_fir_fft_cc [window] It performs a bandpass FIR filter on complex samples, using FFT and the overlap-add method. Parameters are described under `firdes_bandpass_c` and `firdes_lowpass_f`. -##### `agc_ff [hang_time [reference [attack_rate [decay_rate [max_gain [attack_wait [filter_alpha]]]]]]]` + agc_ff [hang_time [reference [attack_rate [decay_rate [max_gain [attack_wait [filter_alpha]]]]]]] It is an automatic gain control function. @@ -278,11 +279,11 @@ It is an automatic gain control function. Its default parameters work best for an audio signal sampled at 48000 Hz. -##### `fastagc_ff [block_size [reference]]` + fastagc_ff [block_size [reference]] It is a faster AGC that linearly changes the gain, taking the highest amplitude peak in the buffer into consideration. Its output will never exceed `-reference ... reference`. -##### `fft_cc [window [--octave] [--benchmark]]` + fft_cc [window [--octave] [--benchmark]] It performs an FFT on the first `fft_size` samples out of `out_of_every_n_samples`, thus skipping `out_of_every_n_samples - fft_size` samples in the input. @@ -290,12 +291,12 @@ It can draw the spectrum by using `--octave`, for more information, look at the FFTW can be faster if we let it optimalize a while before starting the first transform, hence the `--benchmark` switch. -##### `fft_benchmark [--benchmark]` + fft_benchmark [--benchmark] It measures the time taken to process `fft_cycles` transforms of `fft_size`. It lets FFTW optimalize if used with the `--benchmark` switch. -##### `lowpower_cf [add_db]` + lowpower_cf [add_db] Calculates `10*log10(i^2+q^2)+add_db` for the input complex samples. It is useful for drawing power spectrum graphs. @@ -303,7 +304,7 @@ Calculates `10*log10(i^2+q^2)+add_db` for the input complex samples. It is usefu Some parameters can be changed while the `csdr` process is running. To achieve this, some `csdr` functions have special parameters. You have to supply a fifo previously created by the `mkfifo` command. Processing will only start after the first control command has been received by `csdr` over the FIFO. -##### `shift_addition_cc --fifo ` + shift_addition_cc --fifo By writing to the given FIFO file with the syntax below, you can control the shift rate: @@ -313,7 +314,7 @@ E.g. you can send `-0.3\n` Processing will only start after the first control command has been received by `csdr` over the FIFO. -##### `bandpass_fir_fft_cc --fifo [window]` + bandpass_fir_fft_cc --fifo [window] By writing to the given FIFO file with the syntax below, you can control the shift rate: @@ -327,8 +328,9 @@ E.g. you can send `-0.05 0.02\n` Licensing --------- -Before the implementation of some algoritms, GPL-licensed code from other applications have been reviewed. +Most of the code for `libcsdr` is under BSD license. +[link](#licensing) However, before the implementation of some algoritms, GPL-licensed code from other applications have been reviewed. In order to eliminate any licesing issues, these parts are placed under a different file. -However, the library is still fully functional with BSD-only code, altough having only less-optimized versions of some algorithms. +However, the library is still fully functional with BSD-only code, altough having only less-optimized versions of some algorithms. It should also be noted that if you compile with `-DUSE_FFTW` and `-DLIBCSDR_GPL` (as default), the GPL license would apply on the whole result.