windytan / redsea Goto Github PK
View Code? Open in Web Editor NEWCommand-line FM-RDS decoder with JSON output.
License: MIT License
Command-line FM-RDS decoder with JSON output.
License: MIT License
A matcher raised root cosine filter would probably improve SNR.
This patch fixed it for me.
diff --git a/rtl_redsea.c b/rtl_redsea.c
index 9ea1e68..2b3dca3 100644
--- a/rtl_redsea.c
+++ b/rtl_redsea.c
@@ -122,8 +122,8 @@ int main(int argc, char **argv) {
reading_frame = 0;
qua = 0;
double t = 0;
while ((c = getopt (argc, argv, "f:")) != -1)
switch (c) {
Soon, the new version of RDS standard will start to be integrated. It's backwards-compatible, but adds additional subcarriers to increase data throughput. It will have many new features: https://en.wikipedia.org/wiki/Radio_Data_System#RDS_2.0.
Will you implement it when the specifications are released?
Hello,
First I would like to say a very very big thank you for your work. Redsea is working like a charm. It's fully support the two commercial TMC services in my local area.
It's seem that the line number 1062 in event_list.h should be
"1356;cold,;cold, minimum temperature (Q);F;6;L;2;;37;M6F"
instead of :
"1356;cold,;cold, maximum temperature (Q);F;6;L;2;;37;M6F"
About TMC encryption : in my case they do not encrypted the location, they just send a different table code that the one expected in my country. Changing the table code in my side to the trick.
Best Regards
Perl v5.14.2
Get this error when trying to run it. If I comment out line 13 it starts fine however there is zero output even for very strong FM stations w/RDS. In programs like SDR# the RDS subcarrier is very viable.
I can't get past autogen/configure/make. It wants to find liquid-dsp, but can't find it.
checking whether gcc understands -c and -o together... yes
checking dependency style of gcc... gcc3
checking for main in -lliquid... no
configure: error: in `/Users/spk/Documents/Source/GitHub/redsea':
configure: error: Could not find liquid-dsp (use --without-liquid to disable)
See `config.log' for more details
spkmbp:redsea spk$
From config.log:
configure:3591: checking for main in -lliquid
configure:3610: gcc -o conftest -g -O2 conftest.c -lliquid >&5
ld: library not found for -lliquid
clang: error: linker command failed with exit code 1 (use -v to see invocation)
liquid-dsp really is installed:
spkmbp:redsea spk$ port list installed | grep liquid-dsp
Warning: The 'list' action only shows the currently available version of each port. To see installed versions, use the 'installed' action.
liquid-dsp @20170513 science/liquid-dsp
spkmbp:redsea spk$ mdfind liquid.h | egrep "\.h$"
/opt/local/include/liquid/liquid.h
/Users/spk/Documents/Source/GitHub/redsea/src/liquid_wrappers.h
spkmbp:redsea spk$
This should hopefully be easy to add. Might help in detection of the RDS sub carrier.
What do you think?
There's an "error-detection" mechanism in TMC that suggests messages should only be displayed after they're received at least twice. This should be implemented in redsea.
that is not discarded?
{"group":"2A","pi":"0x141D","prog_type":"No PTY","radiotext":"Jetzt on air: ** KUNGS feat. JAMIE N COMMONS ** DONT YOU KNOW","tp":true}
{"group":"2A","pi":"0x141D","prog_type":"No PTY","radiotext":"Jetzt on air: ** KUNGS feat. JAMIE N COMMONS ** DOOL YOU KNOW","tp":true}
{"group":"2A","pi":"0x141D","prog_type":"No PTY","radiotext":"Jetzt on air: ** KUNGS feat. JAMIE N COMMONS ** DONT YOU KNOW","tp":true}
DONT -> DOOL -> DONT
rtl_redsea is emitting a sequence of 0's and 1's, but the Perl script doesn't seem to be decoding anything:
kjotte@daedalus:~/git/redsea$ ./rtl_redsea -f 90.7M | ./redsea.pl
Found 1 device(s):
0: Realtek, RTL2841UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Name "main::correct_all" used only once: possible typo at ./redsea.pl line 151.
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
[R82XX] PLL not locked!
Tuned to 312590 Hz.
Oversampling input by: 5x.
Oversampling output by: 1x.
Buffer size: 6.55ms
Exact sample rate is: 1250000.002070 Hz
Sampling at 1250000 S/s.
Output at 250000 Hz.
Currently, multi-part TMC messages are only printed when the next message begins. End of message should be detected instead.
For this to work, a TMC message should know its expected length. This can be calculated from GSI.
$perl redsea.pl 99.0M
Waiting for sync at 99.00 MHz
Found 1 device(s):
0: Realtek, DVB-T Dongle, SN: 00000991
Using device 0: Dexatek DK DVB-T Dongle (Logilink VG0002A)
Found Fitipower FC0013 tuner
Tuner gain set to automatic.
Tuned to 99500000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 4.10ms
Exact sample rate is: 2000000.052982 Hz
Sampling at 2000000 S/s.
Output at 250000 Hz.
As you can see, the "Tuned to" line reports a frequency that is 0.5 MHz above the selected one. It does seem to pick the correct frequency, though. (In my area I have two radio stations which are 0.5 MHz apart, and if I pick the lower one, I get the correct station.)
I didn't investigate further – it may be a bug in rtl-sdr.
I know this part is still in the development, just wanted to point this out:
$ nc -u -l 192.168.1.255 6666 | ./redsea -b | sed -r 's/\/\*[^\/]+.//g'|jq -c 'select(.group=="12A")|.radiotext_plus|select(.["item.artist"]!=null)|[ .["item.artist"],.["item.title"] ]'
[" "," "]
[" "," "]
[" "," "]
[" "," "]
[" Taylor Swif"," Shake It Of"]
it should be "Taylor Swift" I suppose and "Shake It Off"
It should be possible, using a command-line switch, to instruct redsea to use the US standard RBDS instead.
Been looking for something like this for a couple of weeks and just stumbled across it. Maybe call it "super RDS decoder" or similar ? :-)
It should be possible to optionally display the block error rate (BLER), i.e. percentage of erroneous blocks during the last n
blocks or seconds.
There are two distinct definitions of BLER, depending on the time of calculation: either before (transmission BLER) or after error correction (decoding BLER). Decoding BLER is perhaps more useful for redsea users (?).
The BlockStream
member block_has_errors_
is already nearly suitable for this, but for transmission BLER it would need to be able to count error-corrected blocks as well. This would also alter the criteria for sync drop. Whether this is a good thing needs to be tested.
The BLER value should not perhaps refer to a single group; otherwise it could only get one of the values 0, 25, 75, or 100 %. Instead, it should be an average over a dozen or so groups. This may be misleading though, since almost everything else in the JSON object refers to the group at hand.
According to JSON API v1.0, member names must not contain periods. So the RadioText Plus fields should be exploded into objects:
"radiotext_plus":{
"item.artist":"Silbermond",
"item.title":"Das Leichteste der Welt",
"item_running":true
}
should be
"radiotext_plus":{
"item":{
"artist":"Silbermond",
"title":"Das Leichteste der Welt",
},
"item_running":true
}
or
"radiotext_plus":{
"item":{
"artist":"Silbermond",
"title":"Das Leichteste der Welt",
"running":true
}
}
But this would pose a problem, because the content of RT+ class chat
would be of ambiguous type (it may contain a string or an object with center
string). So another way to do this would be:
"radiotext_plus":{
"tags":[
{
"content-type":"item.artist",
"data":"Silbermond"
},
{
"content-type":"item.title",
"data":"Das Leichteste der Welt"
}
],
"item_running":true
}
However, this would make the JSON more difficult to filter.
Occasionally, for a short time, a RT+ tag may contain parts of RadioText it should not apply to, because the change in RadioText was not synchronized with the change in RT+ field lengths.
This appears to be caused at the transmitter; a RT+ tag is transmitted while still transmitting the old RadioText. An example from NDR 2:
| |
D382 2153 6E64 722E | 2A RT | "NDR 2 www.ndr.de/ndr2 "
| | ^^^^
D382 3158 0000 4BD7 | 3A ODA | 12A = RadioText+
| |
D382 2154 6465 2F6E | 2A RT | "NDR 2 www.ndr.de/ndr2 "
| | ^^^^
D382 2155 6472 320D | 2A RT | "NDR 2 www.ndr.de/ndr2 "
| | ^^^^
D382 C148 201C 2244 | 12A RT+ | item.title:"NDR 2 www.ndr"
| | item.artist:"/ndr2 "
D382 2150 4E44 5220 | 2A RT | "NDR 2 www.ndr.de/ndr2 "
| | ^^^^
D382 C148 201C 2244 | 12A RT+ | item.title:"NDR 2 www.ndr"
| | item.artist:"/ndr2 "
D382 2151 3220 2020 | 2A RT | "NDR 2 www.ndr.de/ndr2 "
| | ^^^^
RT+ is handled by parseRadioTextPlus()
.
A workaround would be to, for example, ignore RT+ tags that end or start with whitespace. But this could possibly lead to legit RT+ being ignored.
Maybe the hardware (RPi B+) is not powerful enough?
pi@raspberrypi:~/redsea/src $ rtl_fm -M fm -f 88.2M -l 0 -A std -p 0 -s 228k -F 9 | ./redsea
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
HWTUNER Rafael Micro R820T
Tuner gain set to automatic.
Tuned to 88656000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 4.49ms
SAMPLERATE 1824000.017395
Sampling at 1824000 S/s.
Output at 228000 Hz.
buffer underrun!
...is all Im getting.
Is there a kind of quality indicator?
Following instructions in readme:
kjotte@daedalus:~/git/redsea$ gcc -o rtl_redsea -lm rtl_redsea.c
rtl_redsea.c: In function ‘main’:
rtl_redsea.c:91:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int iq=0;iq<=1;iq++) {
^
rtl_redsea.c:91:5: note: use option -std=c99 or -std=gnu99 to compile your code
Code compiles correctly with command:
kjotte@daedalus:~/git/redsea$ gcc -std=gnu99 -o rtl_redsea rtl_redsea.c -lm
Redsea should recover the clock signal and integrate over the DPSK bit-time to ensure best SNR. Currently there is no locking whatsoever and the signal will fade in and out at the difference frequency between TX and RX clocks.
This locking could be implemented as a PLL. There is a PLL readily available in liquid-dsp.
How to present an estimate of the phase error to the PLL in the presence of gradual 180-degree phase shifts?
There's also a symbol synchronizer in liquid that probably does everything needed for carrier & clock recovery
How to use it in binary DPSK? The example for QPSK does not work for RDS.
Groups should optionally include time of decoding, optionally formatted using strftime. Its name should reflect that it's not the time of transmission.
timestamp_rx:"2017-06-18 11:48:21"
Some TMC messages have zero as their location or event code.
I dont get any RDS text. Is there anything i am missing?
$ rtl_fm -f 95.7e6 -M wbfm -s 200000 -r 48000 - |./redsea -u --feed-through|aplay -f S16_LE -r48000
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 96016000 Hz.
Oversampling input by: 6x.
Oversampling output by: 1x.
Buffer size: 6.83ms
Sampling at 1200000 S/s.
Output at 200000 Hz.
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
I also tried without the -u option, and the result was the same.
The following does give some text:
$ rtl_fm -M fm -l 0 -A std -p 0 -s 171k -g 40 -F 9 -f 95.7e6 |./redsea
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
\Found Rafael Micro R820T tuner
Tuner gain set to 40.20 dB.
Tuned to 96042000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 5.99ms
Exact sample rate is: 1368000.013046 Hz
Sampling at 1368000 S/s.
Output at 171000 Hz.
{"pi":"0x2B25"}
{"di":{"stereo":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"artificial_head":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"compressed":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"dynamic_pty":true},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"stereo":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"artificial_head":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"group":"2A","pi":"0x2B25","prog_type":"Culture","tp":false}
{"di":{"compressed":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"dynamic_pty":true},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ps":" on 95.7","ta":false,"tp":false}
{"di":{"stereo":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
{"di":{"artificial_head":false},"group":"0A","is_music":true,"pi":"0x2B25","prog_type":"Culture","ta":false,"tp":false}
^CSignal caught, exiting!
User cancel, exiting...
Signal caught, exiting!
How do i get RDS with wbfm?
the following is selected: [.location,.event_codes,.description]'
result:
[12823,[243],"."]
[12823,[243],"."]
[12820,[501],"."]
[31769,[802],"."]
[61452,[401,1472],"."]
[12744,[1926],"."]
[7613,[105],"."]
[7613,[105],"."]
[32245,[802,810],"."]
[7613,[241],"."]
[7613,[241],"."]
^C
The input sample rate should be configurable. When it differs from 171k, an internal resampler should be used.
Saw the recording of your talk on the 30C3. Funny stuff, maybe this open-hardware project could be interesting for you:
http://tipok.org.ua/node/35
Same problem as issue 41, but a restart does not solve it
Ubuntu 16.04 64 bit
libliquid.so is installed to /usr/local/lib/libliquid.so
I get
redsea: error while loading shared libraries: libliquid.so: cannot open shared object file: No such file or directory
it looks like the next json could start on the same line before the previous one is finished:
{"pi":"0xd318{"pi":"0xd318","group":"3A","tp":"true","prog_type":"Pop Music","open_data_app":{"oda_group":"8A","app_name":"RDS-TMC: ALERT-C"},"tmc":{"system_info":{"is_encrypted":"false","location_table":"0x01","is_on_alt_freqs":"false","scope":["national","regional","urban"]}}}
Hi I'm trying to compile this on a orange pi with debian jesse.
I have liquid installed but make fails
hadow -Wuninitialized -pedantic -g -O2 -MT redsea-redsea.o -MD -MP -MF .deps/redsea-redsea.Tpo -c -o redsea-redsea.o test -f 'redsea.cc' || echo './'
redsea.cc
In file included from ../src/subcarrier.h:10:0,
from ../src/block_sync.h:10,
from redsea.cc:24:
../src/liquid_wrappers.h:55:31: error: expected â before â
SymSync(liquid_firfilt_type ftype, unsigned k, unsigned m,
^
Makefile:400: recipe for target 'redsea-redsea.o' failed
the configure script can find liquid otherwise it would stop. Any hints?? Thanks in advance
{"pi":"0xd318","group":"3A","tp":"true","prog_type":"Pop Music","open_data_app":{"oda_group":"12A","app_name":"RadioText+ (RT+)"}
there's a missing }
TMC multi-group messages are currently incorrectly decoded, the results are nonsensical.
Hi, I'm having trouble running this on Mac OS X 10.10.2
gcc -std=gnu99 -o rtl_redsea rtl_redsea.c -lm
perl5.18 redsea.pl 105.7M
Found 1 device(s):
0: Generic, RTL2832U, SN: 77771111153705700
Using device 0: Generic RTL2832U
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 106012500 Hz.
Oversampling input by: 5x.
Oversampling output by: 1x.
Buffer size: 6.55ms
Exact sample rate is: 1250000.002070 Hz
Sampling at 1250000 S/s.
Output at 250000 Hz.
Use of uninitialized value in subroutine entry at redsea.pl line 185.
Use of uninitialized value in subroutine entry at redsea.pl line 185.
...
Use of uninitialized value in subroutine entry at redsea.pl line 185.
^CSignal caught, exiting!
User cancel, exiting...
Also, sox --version
produces
sox: SoX v
which seems strange, but I'm not sure if it's related.
Thanks very much for your help
There's a residual phase error of around 6° in the liquid-dsp symbol synchronizer. Probably not a big deal, but not perfect either; it could potentially cause more bit flips than necessary in noisy conditions.
The relevant function is Subcarrier::demodulateMoreBits()
. This phase error seems to come from the PLL NCO that follows the difference frequency between 57 kHz and the actual subcarrier (nco_exact_
).
nco_exact_.stepPLL()
should be called at a different point?nco_exact_.step()
anywhere makes the constellation rotate wildly. But according to Liquid docs, you should call step()
on an NCO or it will not advance. So what's happening here?Here's the constellation of PSK symbols returned by the liquid-dsp functionsymsync_crcf_execute()
:
I've gotten some reports that redsea requires a stronger FM signal than other decoders. Possible reasons discussed here.
rtl_fm
optimal?There's jitter in the 57 kHz PLL (realized as nco_crcf_pll_step
in liquid-pll), especially when the signal is noisy.
Below, the PLL tracks a a good-quality RDS subcarrier. 99.9 % of blocks were received. Time is in seconds.
Here's a noisy signal, with 60.1 % of all blocks received.
Average spectral power of the two signals, good signal in green and the noisy one in red:
Looking at the graph, there's a 27 dB difference in SNR. Is it realistic to receive error-free data in the noisy case?
symtrack
in liquid-dsp 1.3? It seems to perform much worse than the current processing chain + symsync
, but could the parameters be adjusted?Looks like RadioText+ might be dropping the last character. I'm inferring this from the standard RT messages preceeding it:
17EF 2A TP:0 PTY:10 RT:'B93.9 Close Your Eyes Parmalee ↵ ' RT_OK
RadioText+:
Item running
Tag item.artist: Parmale
Tag item.title: Close Your Eye
First of all thanks for your software!
I test in on local fm radio and got some debug TODOs.
So I collect hex dumps in 5 minutes for each stantion with TODOs: todo.dump.zip
There is also one file with "unimplemented ODA app" message.
Hey!
I run readsea with the below command, any ideas what I'm doing wrong ?
$ date ; rtl_fm -M fm -f 88.5M -l 0 -A std -p 0 -s 228k -F 9 | ./redsea 2>&1 > /tmp/ram/redsea_88.5M.log.B.txt ; date
Tue Jul 5 13:02:27 UTC 2016
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 88956000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 4.49ms
Exact sample rate is: 1824000.017395 Hz
Sampling at 1824000 S/s.
Output at 228000 Hz.
redsea: data.cc:10: std::string redsea::getLCDchar(int): Assertion `code >= 32' failed.
Signal caught, exiting!
User cancel, exiting...
Aborted
Tue Jul 5 14:09:12 UTC 2016
$
It looks to happen at random times:
-rw-r--r-- 1 mzs mzs 23356 Jun 30 03:50 redsea_88.5M.log.0.txt.xz
-rw-r--r-- 1 mzs mzs 3764 Jun 30 10:12 redsea_88.5M.log.1.txt.xz
-rw-r--r-- 1 mzs mzs 3208 Jul 1 01:19 redsea_88.5M.log.2.txt.xz
-rw-r--r-- 1 mzs mzs 7864 Jul 1 17:29 redsea_88.5M.log.3.txt.xz
-rw-r--r-- 1 mzs mzs 6364 Jul 1 22:57 redsea_88.5M.log.4.txt.xz
-rw-r--r-- 1 mzs mzs 12092 Jul 2 03:36 redsea_88.5M.log.5.txt.xz
-rw-r--r-- 1 mzs mzs 9040 Jul 2 10:46 redsea_88.5M.log.6.txt.xz
-rw-r--r-- 1 mzs mzs 34284 Jul 2 22:57 redsea_88.5M.log.7.txt.xz
-rw-r--r-- 1 mzs mzs 29644 Jul 3 12:02 redsea_88.5M.log.8.txt.xz
-rw-r--r-- 1 mzs mzs 31604 Jul 4 00:14 redsea_88.5M.log.9.txt.xz
-rw-r--r-- 1 mzs mzs 11460 Jul 5 04:00 redsea_88.5M.log.A.txt.xz
-rw-r--r-- 1 mzs mzs 2136 Jul 5 14:09 redsea_88.5M.log.B.txt.xz
I do not think that I have managed to run it for 24 hours yet without it kicking up that message.
"Sie hoeren: KUNGS FEAT. JAMIE N - DON‖T YOU KNOW"
"¤" - this one seems to be also wrong. I haven't checked any further
By building I got:
$ make
make all-recursive
make[1]: Entering directory `/home/iDoka/soft/redsea'
Making all in src
make[2]: Entering directory `/home/iDoka/soft/redsea/src'
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -g -Wall -Wextra -Weffc++ -Wstrict-overflow -Wshadow -Wuninitialized -pedantic -Wall -std=c++11 -MT redsea-redsea.o -MD -MP -MF .deps/redsea-redsea.Tpo -c -o redsea-redsea.o `test -f 'redsea.cc' || echo './'`redsea.cc
In file included from mpx2bits.h:11:0,
from bits2blocks.h:6,
from redsea.cc:24:
liquid_wrappers.h:6:27: fatal error: liquid/liquid.h: No such file or directory
#include "liquid/liquid.h"
^
compilation terminated.
make[2]: *** [redsea-redsea.o] Error 1
I try to search in repo, but cant find proper package:
$ yum search liquid
=================== N/S matched: liquid ===================
rubygem-liquid-doc.noarch : Documentation for rubygem-liquid
rubygem-liquid.noarch : A secure, non-evaling end user template engine with aesthetic markup
My system is CentOS7 x86_64
The error correction makes a lot of mistakes yet reports them as valid codewords (syndrome == 0). Two options:
Here's an example of the error correction failing. The group is shown separated into blocks (4 hex characters) and checkwords (3 characters).
orig: 6A03/2C7 0421/14A F741/0C6 4557/1B8
err: 0800 0100 0000 0800
corr: 6203 0521 4D57
This leads to the PS string "YLMWUO" (should be "YLESUOMI"). It nevertheless gives syndrome 0 (no errors detected).
The syndrome calculation function (uint32_t calcSyndrome(uint32_t)
in block_sync.cc
) is a shift register implementation using obscure bit magic and should also be reviewed.
Here's what the RDS specs have to say about the error protection scheme:
The error-protecting code has the following error-checking capabilities [3, 4]:
a) Detects all single and double bit errors in a block.
b) Detects any single error burst spanning 10 bits or less.
c) Detects about 99.8% of bursts spanning 11 bits and about 99.9% of all longer bursts.The code is also an optimal burst error correcting code [5] and is capable of correcting any
single burst of span 5 bits or less.
The references point to:
[3] Peterson, W.W., and Brown, D.T.: Cyclic codes for error detection.
Proceedings of the IRE, No. 49, January 1961, pp. 228-235. (pdf)[4] Peterson, W.W., and Weldon, E.J.: Error-correcting codes.
Published by MIT Press, Cambridge Mass., second edition, 1972.[5] Kasami, T.: Optimum shortened cyclic codes for burst error correction.
IEEE Transactions on Information Theory (IT9), No. 4, 1963, pp. 105-109. (doi)
It seems to be easy to get hold of a country's LCL in TMC Exchange format (ISO 14819-3). And in the same package (for Germany) I also got the ECL - but in Excel format which can easily be exported to CSV.
Could you add support to use those files to provide clear text messages for TMC?
Autoconf should be made to check the existence of all functions used from liquid, sndfile.
To compile out of the box on my system, I need to add #include <tuple>
to subcarrier.cc which provides std::tie().
subcarrier.cc: In member function ‘void redsea::Subcarrier::demodulateMoreBits()’:
subcarrier.cc:168:9: error: ‘tie’ is not a member of ‘std’
std::tie(is_clock,biphase) = biphase_decoder_.push(symbol);
^~~
(compiling with Archlinux's gcc-multilib 6.2.1-1, this package provides the c++ stl)
Reading a wav file should be possible without SoX, using libsndfile.
According to the NRSC-4 standard for the U.S., the PI for a station is based on its call sign, according to a formula in the standard : http://www.nrscstandards.org/SG/nrsc-4-B.pdf (see section 7.12). Most stations here in the U.S. (commercial ones, in any case) use PS either for a slogan (as suggested by the NRSC document) or as a 'poor man's RadioText+'. This leads to interesting results when a radio manufacturer doesn't account for this (the radios in BMWs have had this issue before).
It would be nice, perhaps when the -u switch is used, to have the PI decoded into a string like 'WFOO' or 'KBAZ'. This is makes things more consistent when trying to use redsea output to identify stations.
Not all groups seem to get printed by PrintHexGroup()
.
The JSON output from a noisy WAV test file shows (erroneous) PI codes that don't show up in the hex output. This should not happen.
Could you tell me why redsea exits? I've even have copied libliquid.so to the readsea directory. libsndfile is installed, too.
./rtl-rx.sh -f 90.4M
redsea: error while loading shared libraries: libliquid.so: cannot open shared object file: No such file or directory
Found 1 device(s):
0: NOXON, DAB Stick, SN: 0Using device 0: Terratec NOXON DAB/DAB+ USB dongle (rev 1)
Found Fitipower FC0013 tuner
Tuner gain set to 19.70 dB.
Bandwidth set to automatic resulted in 0 Hz.
Tuned to 90058000 Hz.
Oversampling input by: 8x.
Oversampling output by: 1x.
Buffer size: 5.99ms
Exact sample rate is: 1368000.013046 Hz
Sampling at 1368000 S/s.
Output at 171000 Hz.
Signal caught, exiting!User cancel, exiting...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.