2016-02-04 04:27:53 -05:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
|
|
|
* Copyright (C) 2016 Furrtek
|
2023-05-18 16:16:05 -04:00
|
|
|
*
|
2016-02-04 04:27:53 -05:00
|
|
|
* This file is part of PortaPack.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; see the file COPYING. If not, write to
|
|
|
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __PROC_RDS_H__
|
|
|
|
#define __PROC_RDS_H__
|
|
|
|
|
|
|
|
#include "baseband_processor.hpp"
|
2016-08-16 20:55:34 -04:00
|
|
|
#include "baseband_thread.hpp"
|
2016-02-04 04:27:53 -05:00
|
|
|
|
|
|
|
#define SAMPLES_PER_BIT 192
|
|
|
|
#define FILTER_SIZE 576
|
|
|
|
#define SAMPLE_BUFFER_SIZE SAMPLES_PER_BIT + FILTER_SIZE
|
|
|
|
|
|
|
|
class RDSProcessor : public BasebandProcessor {
|
2023-05-18 16:16:05 -04:00
|
|
|
public:
|
|
|
|
void execute(const buffer_c8_t& buffer) override;
|
|
|
|
void on_message(const Message* const msg) override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint32_t* rdsdata{};
|
|
|
|
|
|
|
|
uint16_t message_length{0};
|
|
|
|
int8_t re{0}, im{0};
|
|
|
|
uint8_t mphase{0}, s{0};
|
|
|
|
uint32_t bit_pos{0};
|
2016-02-04 04:27:53 -05:00
|
|
|
int32_t sample_buffer[SAMPLE_BUFFER_SIZE] = {0};
|
2023-05-18 16:16:05 -04:00
|
|
|
int32_t val{0};
|
|
|
|
uint8_t prev_output{0};
|
|
|
|
uint8_t cur_output{0};
|
|
|
|
uint8_t cur_bit{0};
|
2016-02-04 04:27:53 -05:00
|
|
|
int sample_count = SAMPLES_PER_BIT;
|
|
|
|
int in_sample_index = 0;
|
2023-05-18 16:16:05 -04:00
|
|
|
int32_t sample{0};
|
2016-05-29 06:06:47 -04:00
|
|
|
int out_sample_index = SAMPLE_BUFFER_SIZE - 1;
|
2023-05-18 16:16:05 -04:00
|
|
|
uint32_t phase{0}, sphase{0};
|
|
|
|
int32_t delta{0};
|
2016-02-04 04:27:53 -05:00
|
|
|
|
2023-05-18 16:16:05 -04:00
|
|
|
bool configured{false};
|
2016-02-04 04:27:53 -05:00
|
|
|
|
2023-05-18 16:16:05 -04:00
|
|
|
const int32_t waveform_biphase[576] = {
|
|
|
|
165, 167, 168, 168, 167, 166, 163, 160,
|
|
|
|
157, 152, 147, 141, 134, 126, 118, 109,
|
|
|
|
99, 88, 77, 66, 53, 41, 27, 14,
|
|
|
|
0, -14, -29, -44, -59, -74, -89, -105,
|
|
|
|
-120, -135, -150, -165, -179, -193, -206, -218,
|
|
|
|
-231, -242, -252, -262, -271, -279, -286, -291,
|
|
|
|
-296, -299, -301, -302, -302, -300, -297, -292,
|
|
|
|
-286, -278, -269, -259, -247, -233, -219, -202,
|
|
|
|
-185, -166, -145, -124, -101, -77, -52, -26,
|
|
|
|
0, 27, 56, 85, 114, 144, 175, 205,
|
|
|
|
236, 266, 296, 326, 356, 384, 412, 439,
|
|
|
|
465, 490, 513, 535, 555, 574, 590, 604,
|
|
|
|
616, 626, 633, 637, 639, 638, 633, 626,
|
|
|
|
616, 602, 586, 565, 542, 515, 485, 451,
|
|
|
|
414, 373, 329, 282, 232, 178, 121, 62,
|
|
|
|
0, -65, -132, -202, -274, -347, -423, -500,
|
|
|
|
-578, -656, -736, -815, -894, -973, -1051, -1128,
|
|
|
|
-1203, -1276, -1347, -1415, -1479, -1540, -1596, -1648,
|
|
|
|
-1695, -1736, -1771, -1799, -1820, -1833, -1838, -1835,
|
|
|
|
-1822, -1800, -1767, -1724, -1670, -1605, -1527, -1437,
|
|
|
|
-1334, -1217, -1087, -943, -785, -611, -423, -219,
|
|
|
|
0, 235, 487, 755, 1040, 1341, 1659, 1994,
|
|
|
|
2346, 2715, 3101, 3504, 3923, 4359, 4811, 5280,
|
|
|
|
5764, 6264, 6780, 7310, 7856, 8415, 8987, 9573,
|
|
|
|
10172, 10782, 11404, 12036, 12678, 13329, 13989, 14656,
|
|
|
|
15330, 16009, 16694, 17382, 18074, 18767, 19461, 20155,
|
|
|
|
20848, 21539, 22226, 22909, 23586, 24256, 24918, 25571,
|
|
|
|
26214, 26845, 27464, 28068, 28658, 29231, 29787, 30325,
|
|
|
|
30842, 31339, 31814, 32266, 32694, 33097, 33473, 33823,
|
|
|
|
34144, 34437, 34699, 34931, 35131, 35299, 35434, 35535,
|
|
|
|
35602, 35634, 35630, 35591, 35515, 35402, 35252, 35065,
|
|
|
|
34841, 34579, 34279, 33941, 33566, 33153, 32702, 32214,
|
|
|
|
31689, 31128, 30530, 29897, 29228, 28525, 27788, 27017,
|
|
|
|
26214, 25379, 24513, 23617, 22693, 21740, 20761, 19755,
|
|
|
|
18725, 17672, 16597, 15501, 14385, 13251, 12101, 10935,
|
|
|
|
9755, 8563, 7360, 6148, 4927, 3701, 2470, 1235,
|
|
|
|
0, -1235, -2470, -3701, -4927, -6148, -7360, -8563,
|
|
|
|
-9755, -10935, -12101, -13251, -14385, -15501, -16597, -17672,
|
|
|
|
-18725, -19755, -20761, -21740, -22693, -23617, -24513, -25379,
|
|
|
|
-26214, -27017, -27788, -28525, -29228, -29897, -30530, -31128,
|
|
|
|
-31689, -32214, -32702, -33153, -33566, -33941, -34279, -34579,
|
|
|
|
-34841, -35065, -35252, -35402, -35515, -35591, -35630, -35634,
|
|
|
|
-35602, -35535, -35434, -35299, -35131, -34931, -34699, -34437,
|
|
|
|
-34144, -33823, -33473, -33097, -32694, -32266, -31814, -31339,
|
|
|
|
-30842, -30325, -29787, -29231, -28658, -28068, -27464, -26845,
|
|
|
|
-26214, -25571, -24918, -24256, -23586, -22909, -22226, -21539,
|
|
|
|
-20848, -20155, -19461, -18767, -18074, -17382, -16694, -16009,
|
|
|
|
-15330, -14656, -13989, -13329, -12678, -12036, -11404, -10782,
|
|
|
|
-10172, -9573, -8987, -8415, -7856, -7310, -6780, -6264,
|
|
|
|
-5764, -5280, -4811, -4359, -3923, -3504, -3101, -2715,
|
|
|
|
-2346, -1994, -1659, -1341, -1040, -755, -487, -235,
|
|
|
|
0, 219, 423, 611, 785, 943, 1087, 1217,
|
|
|
|
1334, 1437, 1527, 1605, 1670, 1724, 1767, 1800,
|
|
|
|
1822, 1835, 1838, 1833, 1820, 1799, 1771, 1736,
|
|
|
|
1695, 1648, 1596, 1540, 1479, 1415, 1347, 1276,
|
|
|
|
1203, 1128, 1051, 973, 894, 815, 736, 656,
|
|
|
|
578, 500, 423, 347, 274, 202, 132, 65,
|
|
|
|
0, -62, -121, -178, -232, -282, -329, -373,
|
|
|
|
-414, -451, -485, -515, -542, -565, -586, -602,
|
|
|
|
-616, -626, -633, -638, -639, -637, -633, -626,
|
|
|
|
-616, -604, -590, -574, -555, -535, -513, -490,
|
|
|
|
-465, -439, -412, -384, -356, -326, -296, -266,
|
|
|
|
-236, -205, -175, -144, -114, -85, -56, -27,
|
|
|
|
0, 26, 52, 77, 101, 124, 145, 166,
|
|
|
|
185, 202, 219, 233, 247, 259, 269, 278,
|
|
|
|
286, 292, 297, 300, 302, 302, 301, 299,
|
|
|
|
296, 291, 286, 279, 271, 262, 252, 242,
|
|
|
|
231, 218, 206, 193, 179, 165, 150, 135,
|
|
|
|
120, 105, 89, 74, 59, 44, 29, 14,
|
|
|
|
0, -14, -27, -41, -53, -66, -77, -88,
|
|
|
|
-99, -109, -118, -126, -134, -141, -147, -152,
|
|
|
|
-157, -160, -163, -166, -167, -168, -168, -167};
|
2023-07-23 02:54:17 -04:00
|
|
|
|
|
|
|
/* NB: Threads should be the last members in the class definition. */
|
|
|
|
BasebandThread baseband_thread{2280000, this, baseband::Direction::Transmit};
|
2016-02-04 04:27:53 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|