Você tem um bom conjunto de circunstâncias aqui; você deve conseguir atingir seu objetivo sem muita dificuldade. Não vejo nada na sua descrição que elimine toda uma classe de modulação (por exemplo , chaveamento de mudança de fase, chaveamento de mudança de frequência etc.). Alguns dos fatores que escolheriam um formato adequado incluem:
- A eficiência espectral necessária (ou seja, quanto você precisa de throughput de dados em relação à largura de banda disponível)
- Os requisitos de complexidade para o seu receptor (que geralmente é a parte mais complicada do sistema)
- Quanto esforço você está disposto a colocar no desenvolvimento da implementação.
- Outras circunstâncias específicas da sua aplicação (por exemplo, se você tiver uma precisão de tempo ruim em uma ou ambas as extremidades, interferência conhecida ou uma resposta de canal ruim)
Assim, marcando-as uma a uma para o seu sistema, podemos apresentar algumas diretrizes:
Parece que sua maior restrição é a resposta do canal (que é limitada pelo DAC da sua placa de som). Se você tiver 40 kHz de largura de banda unilateral disponível, ficará limitado a uma taxa de símbolos um pouco abaixo disso. Para uma taxa de dados alvo de pelo menos 40 kilobits por segundo, convém um esquema que transmita vários bits por símbolo.
Desde que sua plataforma incorporada não seja carregada com muitas outras funções, um moderno processador ARM de 120 MHz deve ser capaz de lidar com a desmodulação de quase todos os formatos na faixa de dezenas de kilobits por segundo.
Não tenho certeza especificamente de qual modelo você está executando, mas muitos processadores recentes fornecem uma integração muito estreita de ADCs integrados com o subsistema de memória e interrupção, talvez permitindo (sem intervenção manual da CPU) amostrar automaticamente o sinal de entrada em um especificado , armazene as amostras na memória interna e acione a interrupção do processador apenas quando um bloco de amostras de determinado tamanho estiver disponível para ser processado. Eu sei que alguns dispositivos Atmel, no mínimo, fornecem esse tipo de funcionalidade; Eu tive um bom sucesso com eles no passado.
EbN0
No que diz respeito a circunstâncias especiais, para este sistema, eu não esperaria muito. Eu esperaria que a precisão do oscilador no lado do PC fosse muito boa (no mínimo controlado por cristal , então você está na faixa de <50 ppm ou mais; possivelmente muito melhor se o oscilador for calibrado usando outra fonte mais precisa ) O lado incorporado provavelmente será o mesmo; Suponho que você esteja usando um oscilador de cristal como fonte do relógio. Como as duas extremidades estão conectadas, presumo que você não tenha interferência.
Então, juntando tudo isso em uma única recomendação, eu provavelmente começaria o caminho de uma abordagem de mudança de fase em quadratura (QPSK) a 24 quilos de símbolos por segundo . Com 2 bits por símbolo, isso gera uma taxa de dados de 48 kilobits por segundo, que excede seus requisitos. Essa taxa específica facilita a sua implementação; como o DAC de saída está funcionando a 96 kHz, isso resulta em 4 amostras por símbolo (é sempre mais fácil executar em um número inteiro de amostras por tempo de símbolo). Eu provavelmente tentaria projetar o lado incorporado para que ele amostrasse na mesma taxa de 96 kHz, se possível; isso evita a necessidade de fazer qualquer reamostragem na extremidade com menos recursos.
Para evitar problemas com o entalhe DC que o DAC da placa de som emprega, você pode modular o sinal QPSK em uma operadora a 24 kHz. Então, o espectro do sinal modulado teria um valor nulo em DC, o que seria alinhado com o seu entalhe. É possível que o entalhe possa acabar não sendo um problema (especialmente se tiver apenas alguns Hz de largura, como sugerido). Nesse caso, você poderia se dar bem com um esquema ainda mais simples que funciona apenas na banda base, ignorando completamente a modulação da operadora.
O QPSK é uma boa escolha devido à sua simplicidade, tanto no transmissor quanto no receptor. No seu SNR, você pode obter maior eficiência espectral usando um esquema mais complicado, como modulação em amplitude em quadratura (QAM) , mas a propriedade de envelope constante dos sinais PSK é atraente do ponto de vista da complexidade do receptor. Como uma observação, se você realmente precisa de mais bits por símbolo no futuro, poderá passar para uma constelação de PSK de ordem superior como 8 ou 16-PSK. No entanto, eles são abaixo do ideal do ponto de vista do desempenho da taxa de erros de bits quando comparados às constelações QAM.
No que diz respeito à implementação de uma biblioteca, não estou ciente de nada que você possa ir e vir, especialmente para uma plataforma incorporada. É provável que a implementação do seu receptor esteja ligada à interface de hardware até certo ponto. Você pode encontrar algumas implementações existentes para as várias etapas necessárias para o demodulador, mas precisará pelo menos ajustar o que pode funcionar para funcionar bem em sua plataforma. O projeto GNU Radio é um bom lugar para procurar se você só deseja ver implementações em C ++ de muitas operações diferentes de processamento de sinais de comunicação e pode até gerar uma estrutura útil para implementar o transmissor a bordo do seu PC. Como um resumo, as etapas de alto nível que seu receptor precisaria executar incluiriam:
Pode parecer um processo complicado, mas construir um receptor prático para uma situação simples como essa pode ser muito esclarecedor. Apenas comente se há mais alguma coisa que eu deixei de fora.