Application note on using rpitx
Go to file
András Retzler 8221666ad8 Update README.md 2015-11-08 16:02:54 +01:00
LICENSE Initial commit 2015-11-08 13:49:28 +01:00
README.md Update README.md 2015-11-08 16:02:54 +01:00
music48000.raw Added speech test file. 2015-11-08 15:19:06 +01:00
speech48000.raw Added speech test file. 2015-11-08 15:19:06 +01:00

README.md

Application note on using rpitx

Using with csdr to modulate streaming input

You will need the dev branch of csdr for doing this.
Setup instructions:

git clone https://github.com/simonyiszk/csdr.git
cd csdr
git fetch
git checkout dev
make && sudo make install 

Note that it should be already done if you installed qtcsdr previously.

Modulate from raw audio file

These examples will use the raw audio file music48000.raw and speech48000.raw, which is present in this repo. You can get this file by:

git clone https://github.com/ha7ilm/rpitx-app-note
cd rpitx-app-note; ls  #There is your file.

We will play these files in a loop, you can stop it with Ctrl+C.

Generate AM modulation:

(while true; do cat music48000.raw; done) | csdr convert_i16_f | csdr gain_ff 1.0 | csdr dsb_fc | csdr add_dcoffset_cc | sudo rpitx -i- -m IQFLOAT -f 28400
  • The part csdr gain_ff 1.0 can be changed to increase/decrease modulation.
  • The -f 28400 at the end gives the transmit frequency in kHz.

Generate USB modulation:

(while true; do cat speech48000.raw; done) | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc 0 0.1 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400

Generate LSB modulation:

(while true; do cat speech48000.raw; done) | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc -0.1 0 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400
  • It's the matter of the filter which sideband do we select:
    • csdr bandpass_fir_fft_cc -0.1 0 is the lower sideband
    • csdr bandpass_fir_fft_cc 0 0.1 is the upper sideband
  • I have experienced that if the SSB signal is in the center of the I/Q signal, then it is not transmitted correctly. The solution was to shift it. So the exact frequency should be around: rpitx frequency + 48000*0.2 = rpitx frequency + 9600 Hz

Generate NFM modulation:

(while true; do cat music48000.raw; done) | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400

Generate WFM modulation:

(while true; do cat music48000.raw; done) | csdr convert_i16_f | csdr gain_ff 70000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400
  • Frequency deviation is set much higher with csdr gain_ff 70000, that's the only difference between this and NFM.

Modulate from microphone input source

Use this if you have a microphone connected to the Raspberry Pi via external USB audio device.
You will have to get the correct ALSA device ID via arecord -L, it will be something like plughw:CARD=Device,DEV=0. You should enter as the argument of the -D switch of arecord.

#AM:
arecord -c1 -r48000 -D plughw:CARD=Device,DEV=0 -fS16_LE - | csdr convert_i16_f | csdr gain_ff 1.0 | csdr dsb_fc | csdr add_dcoffset_cc | sudo rpitx -i- -m IQFLOAT -f 28400
#USB:
arecord -c1 -r48000 -D plughw:CARD=Device,DEV=0 -fS16_LE - | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc 0 0.1 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400
#LSB:
arecord -c1 -r48000 -D plughw:CARD=Device,DEV=0 -fS16_LE - | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc -0.1 0 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400
#NFM:
arecord -c1 -r48000 -D plughw:CARD=Device,DEV=0 -fS16_LE - | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400
#WFM:
arecord -c1 -r48000 -D plughw:CARD=Device,DEV=0 -fS16_LE - | csdr convert_i16_f | csdr gain_ff 70000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400

Stream audio from remote computer

First, start the transmitter:

#AM:
nc -l 8011 | csdr convert_i16_f | csdr gain_ff 1.0 | csdr dsb_fc | csdr add_dcoffset_cc | sudo rpitx -i- -m IQFLOAT -f 28400
#USB:
nc -l 8011 | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc 0 0.1 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400
#LSB:
nc -l 8011 | csdr convert_i16_f | csdr dsb_fc | csdr bandpass_fir_fft_cc -0.1 0 0.01 | csdr gain_ff 2.0 | csdr shift_addition_cc 0.2 | sudo rpitx -i- -m IQFLOAT -f 28400
#NFM:
nc -l 8011 | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400
#WFM:
nc -l 8011 | csdr convert_i16_f | csdr gain_ff 70000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400

The Raspberry Pi will listen on TCP port 8011, and wait for connection.

Then, on the remote computer, execute:

arecord -fS16_LE -r48000 -c1 - | nc raspberrypi.local 8011

You should replace raspberrypi.local with the IP address of the Raspberry Pi (unless avahi config is the default).

Using ADPCM codec to decrease network usage while streaming:

Let's see an example for this on the NFM modulator. Execute on the Raspberry Pi:

nc -l 8011 | csdr decode_ima_adpcm_u8_i16 | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 28400

On the PC, execute this:

arecord -fS16_LE -r48000 -c1 - | csdr encode_ima_adpcm_i16_u8 | nc raspberrypi.local 8011