如何用液体 dsp 解调类似 DominoEx 的信号?

信息处理 解调 fsk dsp-拼图
2022-02-01 01:34:36

我发现了一个用于业余无线电频段的专有协议。作者已经公布了细节,声称它是 DominoEX 的一个版本,波特率和 FEC 略有不同。

我想尝试为该模式编写一个免费的解调器,因为我一般都喜欢收音机。但是我没有任何与 DSP 相关的背景,所以我决定使用一个已经隐藏了所有数学的库。但它有我不完全理解的参数。

所以,我有一个包含一个传输的 wav 文件。我想得到符号,(处理它们是另一个问题)。

DominoEx 是 IFSK 调制,但液体 dsp 没有 IFSK 解调器,所以我假设我可以使用常规 MFSK 调制解调器,然后计算符号之间的距离。(这是正确的吗?)

但是fskdem_demodulate需要复杂的浮点数组(可能是 I/Q 流),所以我需要将我的 wav 文件“转换”为复数。我发现我可以为此使用希尔伯特变换。然而,在液体 dsp 中,它与某种过滤器结合使用,这让我认为我走错了路。所以,这是第一个子问题:如何将常规 AF 12000 样本/秒转换为复杂的浮点数组?如果我应该使用firhilbf什么“半长度”和“阻带衰减” - 参数firhilbf_create- 我应该选择。

下一步是将样本提供给fskdem_demodulate,但是它需要几个我不完全理解的参数。

  • m(每个符号的位数)- 对于 DominoEx,它是 4,但是,它的符号数是 18,比 4 位所需的多 2。我应该使用什么号码?
  • k(每个符号的样本)。每个符号过滤样本?它应该是 12000/1.55​​(输入文件采样率/bps)但 12000/1.66 = 7741,这超过了库设置的最大值 2048。即使我将采样率降低到 6000s/s(SSB 带宽为 3 kHz),它仍然太多了。
  • bandwidth- 我找到了 DominoEx 标准速率的带宽,但首先我处理的是非标准速率(1.55 bd),第二个液体 dsp 不需要 Hz,而是一些浮点值。

更多问题:

现在我正在处理仔细预先录制的 wav 文件(我将其转换为 32 位浮点原始文件(如果我在 x86_64 机器上运行我的代码,我应该将其转换为 64 位浮点数吗?))但实际上我'将从声卡中获取音频,传输可以随时开始。fskdem_demodulate假设“符号时间是完美的”。所以我需要检测第一个符号的第一个样本。我怎样才能做到这一点?

上面的小“每个符号样本”以及在一个 SSB 通道中出现多个信号的可能性使我认为我应该添加某种滤波器,该滤波器将通过输入信号的一小部分(<200 Hz),从而减少“每个符号的样本”需要。或者下变频器,因为 Fldigi 等软件允许您在瀑布上选择一个位置。

我在这里肯定问了太多问题,那么有没有我可以查看的有据可查的开源软件?我还没有找到任何“真实世界”的液体 dsp MFSK 解调示例。有liquidwolf,但它似乎没有使用liquid dsp(所有解调都在它自己的代码中完成)。也许有一个更受欢迎的库,其中包含更多文档齐全的不言自明的示例?我尝试将wsprd(也使用MFSK,但使用4FSK而不是18FSK)移植到android并成功,但我完全尊重作者,它的代码很难理解,所以我只触及了“输入”和“输出” " 部分,完全删除了 fortran 部分,就像我在其他人对 wsprd 的修改中看到的那样。

如果没有足够的文字,有调制摘要:

  • IFSK,基于 DominoEx
  • 1.55 波特率,18 个符号,但每个符号 4 位

我失败的尝试:

``

int main(int argc, char*argv[]){
FILE *fin = fopen("input.raw","rb"); // 12000s/s 32bit float header-less

unsigned int m           =   4;     // number of bits/symbol
unsigned int k           =   0;     // filter samples/symbol
unsigned int M    = 1 << m;
float        bandwidth   = 0.20;
// initial value
if (k == 0)
    k = 2 << m; // set samples per symbol if not otherwise specified
// should be a correct value
k = 12000/1.55;

// create Hilbert transform object
float As=60.0f;                 // stop-band attenuation [dB]
firhilbf q = firhilbf_create(64,As);

// Hilbert filter semi-length
fskdem dem = fskdem_create(m,k,bandwidth);
fskdem_print(dem);

float x[k];         // real input
float complex y[k];   // complex output

unsigned int sym=0;

while(1){
    int red = fread(&x,sizeof(float),k,fin);
    if(red==0)
        break;
    
    firhilbf_decim_execute_block(q, x, k, y);
    sym = fskdem_demodulate(dem, y);
    printf("%d ",sym);
}
printf("\n");

} ``

0个回答
没有发现任何回复~