Scientific Computing

Linux loopback audio record

Easily record the sounds heard through system speakers on Linux with Pulseaudio and Audacity.

apt install audacity pavucontrol

To record “what you hear” in Audacity: “click to monitor” (right of microphone in main Audacity screen). Start Pulseaudio advanced configuration tool

pavucontrol

Under pavucontrol Recording tab input, select “Monitor of Built-in XXX” where XXX is the playback device you wish to monitor. This loopback audio from pavucontrol allows recording what you hear in Linux using Audacity and PulseAudio.

PulseAudio loopback

List comments/annotations in PDF

On Windows, Adobe Reader can export and view a list of comments through the Comment tab on the right side. On Linux, in Evince PDF viewer, the side pane has a drop-down annotations menu that lists comments. Press F9 key if you don’t see the left-hand panel.

One can extract all comments and annotations from a PDF file by

apt install texlive-latex-extra

pdfannotextractor --install

pdfannotextractor in.pdf

This yields a .pax file without plain text. However, it was not clear how to read this file.

Open same PDF multiple times in Evince

It’s often useful to open the same PDF file multiple times, particularly when reviewing journal article drafts to view figures simultaneously with text describing the figure.

From Evince (popular Linux PDF viewer), Menu select “Open a Copy”. Open as many copies of the same Postscript or PDF document as desired.

Restarting Unity desktop in Ubuntu

This is for Ubuntu < 18.04. Ubuntu ≥ 18.04 no longer use Unity.


If the desktop seems to freeze for more than a few seconds, try

  1. press together the keys: Ctrl Alt F1
  2. login and type
unity & disown

This leaves desktop/apps all as they were while fixing the broken state.

Full desktop reset

Restart the whole Unity desktop (which is like unto logging out and logging in, discarding the current desktop):

service lightdm restart

Jekyll Markdown syntax highlighting

Jekyll uses Markdown or HTML files to statically render complex websites from simple text files. While Jekyll syntax highlighting is possible, more often we might use more generic Markdown commands.

Enable syntax highlighting: Before every code block, simply include the language name, for example

```fortran

this even works for gdb.

The color code syntax highlighting on your webpage looks quite striking, and the number of languages covered is very extensive. Despite the different syntax highlighter modules used by different Jekyll web hosting services, almost every language works with the method above.

Github uses Linguist syntax highlighting for its own service (Issues, README.md, etc.) Github/Gitlab Pages can use Rouge syntax highlighting via Jekyll _config.yml – specify an allowed syntax highlighter.

Read last lines of file with Python deque

Python collections.deque is a fast FIFO that does not require thread locking as the more sophisticated queue.

Use deque to read the last line of files as follows.

from pathlib import Path
from collections import deque

fn = Path('myfile.txt')

with fn.open('r') as f:
    last = deque(f, 1)[0]
last
last line of file. Throws IndexError if file is empty.

By changing 1 the last N lines of the file may be read and indexed.

deque examples

MURS VHF vs. 900 MHz modems

At first glance, the two watt transmit power limit across five VHF channels can make MURS seem appealing for long-range license-free radio systems. In fact, companies such as GoTenna initially chose MURS for their first generation product.

The clear choice for almost all applications is to use 900 MHz modems over MURS 150 MHz modems. Contact us for a more formal analysis for your application.

MURS data bandwidth:

Freq [MHz] raw data rate (kbps)
151.82 9600
151.88 9600
151.94 9600
154.57 19200
154.60 19200

At first glance, MURS seems to have a comparable data rate to the $39 one watt 868/900/920 MHz modems, and similar hardware pricing, with seemingly longer range due to 150 MHz vs. 900 MHz frequency. Interference limits data throughput.

MURS interference

MURS arose in part because of the decades-long abuse of these five VHF itinerant frequencies. Like the delicensing of 27 MHz CB Radio, the license-free MURS channels arose due to chronic unlicensed use. Warehouses, hotels, shopping malls, construction sites, etc. use MURS frequencies.

The critical point is that in general MURS modems are stuck on one frequency until reprogrammed. $14 walkie talkies meanwhile are clogging up the channels. Cable TV leakage is also a problem at VHF.

Many applications of wireless modems have a latency requirement–how long will an MURS channel be blocked by noise and other users? The answer comes in using 900 MHz spread-spectrum radio.

900 MHz advantages

900 MHz is also a heavily used frequency band. The key distinction is this use is spread over as much as 26 MHz (USA). The one watt transmit power allowed in the USA and numerous other countries, and tens of milliwatts in other countries allows multi-kilometer line-of-sight range, just like 150 MHz radios.

Some 900 MHz modems have a channel list where they hop upon interference, while the high power radios typically employ FHSS. Having a clear RF channel via FHSS is key to getting even low data bandwidth transmissions through reliably with low latency.

Power on/off USB port in Terminal

USB host/hubs can use Terminal commands to power on/off USB port remotely.

  • Linux: apt install gcc make libusb-1.0-0-dev
  • macOS: brew install gcc libusb make

The uhubctl program allows controlling power for many USB hub models:

git clone https://github.com/mvp/uhubctl

make

./uhubctl -h

Note: key system devices, even built-in laptop keyboards are connected by USB, and you could accidentally poweroff your own laptop keyboard. So use a little care to identify which hardware port a device is connected to.


Beaglebone Black can power on/off USB ports via devmem2, useful for automatic remote powering on/off of USB peripherals to save energy/heat.

In general devmem2 reads/writes bytes, here the address to control the Beaglebone USB port is known a priori.

apt install devmem2

If apt install devmem2 doesn’t work, you can manually compile:

git clone https://github.com/VCTLabs/devmem2
make
make install

Power on USB port remotely:

devmem2 0x47401c60 b 1

This powered up my Wifi dongle.

I measured 0 V on the USB host port before issuing this command, and measured 5 V after the command.

Reference for USB power on command using devmem2

Decoding FM subcarrier SCA with GNURadio

Decode SCA broadcast in the 88-108 MHz VHF FM broadcast band with GNU Radio Companion WBFM_SCA.grc along with numerous other GNU Radio examples.

GNU Radio Companion block diagram for FM SCA decode

GRC SCA decode diagram

This article explains SCA decoding as well as modern uses of spectrum adjacent to the main stereo VHF FM broadcast band signal.

How SCA decoding works

Consider the baseband FM diagram below. Do not confuse the abscissa with RF spectrum–this is baseband spectrum that is FM modulated before being transmitted on air. Unfortunately even some technically-oriented websites get this basic and critical fact wrong.

Plain monaural broadcast FM as used prior to 1955/1961, and used wisely by some talk stations today instead of stereo to improve geographic coverage area by reduction of multipath interference, is frequency modulated audio from 50 Hz - 15 kHz. FM multiplexing was employed in the early FM experiments by Armstrong, back to Nov. 1934 to send additional audio channels, faxes, etc. and SCA became generally legal for broadcasters in 1955. The April 1961 selection of the GE / Zenith FM stereo system chose a 19 kHz stereo pilot. 19 kHz is high enough above legacy monaural receivers low-pass filter response to not bother listeners.

year mono % SCA % stereo L-R % stereo pilot %
1948-1955 100
1955-1961 90 10
1961-1984 40 10 2 * 20 10
1984- (typ.) 45 10 2 * 22.5 10
1984- (max.) 40 20 2 * 20 10
  • stereo + SCA permits 110% modulation, deviation: 75 kHz → 82.5 kHz
  • SCA % allowed includes 57 kHz RDS
  • by taking 10 % away from main audio (5% L+R, 5% L-R) a total of 20 % can be SCA
WBFM baseband spectrum elements

WBFM baseband spectra with SCA, RDS, stereo elements.

SCA decode steps

To decode SCA audio:

  1. 88-108 MHz receiver, perhaps direct conversion RTL-SDR, assuming 960 ks/s
  2. bandpass filter say ± 180 kHz before FM demodulation, to block adjacent stations while not making too much distortion. Remember the infinite sidebands of FM–don’t just clip to ± 75 kHz, it will sound badly distorted. OK to decimate down to 480 ks/s.
  3. plain FM demodulation (differentiator) – do not use de-emphasis at this point.
  4. frequency translate and low-pass filter SCA carrier e.g. -67 kHz shift, then low-pass filter 10 kHz or so.
  5. FM demodulate this signal with 150 µs de-emphasis and decimate to sound card rate e.g. 48 ks/s
  6. A normal baseband audio signal is emitted, if one was broadcast at this SCA frequency.

References

Related: FMeXtra vs. HD Radio digital FM SCA

Fix FreeRDP remote host id has changed

When connecting to multiple Windows PCs using SSH port forwarding,  you might get error:

The host key for localhost has changed
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

Consider the security implications of option:

/cert-ignore

option in the freerdp command to bypass this error message.

Since the SSH server and RDP are both on the same Windows PC, the man-in-the-middle check may be somewhat less likely to be needed.

Example

  • Remote PC IP: 1.2.3.4
  • Remote PC SSH port: 22 (open TCP firewall)
  • Remote PC RDP port: 3389 (blocked by remote PC firewall)
#!/bin/sh
ssh -f -p 22 -L 3391:localhost:3389 joe@1.2.3.4 sleep 1;
xfreerdp /cert-ignore /u:joe /v:localhost:3391