Estou tentando transmitir dados binários de um dispositivo para outro através de um canal de áudio (alto-falante / microfone). Eu uso AFSK (Audio Frequency Shift Keying) como em Packet Radio, com e duas freqüências e . Eu brinquei um pouco no Ruby e minha primeira implementação simplesmente imita um demodulador incoerente clássico, que funciona bem até agora.
O problema é que estou tentando portar isso para uma plataforma móvel em que o desempenho é uma preocupação e minha solução atual é muito lenta. Encontrei várias maneiras de desmodular o AFSK no software:
- DFT deslizante (FFT)
- Filtro de Görtzel deslizante
- Loop bloqueado de fase
- Zero Crossing
Qual seria o caminho a seguir? Existem muitas opções para escolher. Tenho certeza de que existem ainda mais opções disponíveis. Talvez existam soluções ainda melhores do que as que eu citei acima? Alguém tem algum exemplo de código para mim? Estou preocupado com
- Desempenho (deve ser executado na plataforma móvel, por exemplo, um dispositivo iOS ou Android)
- Estabilidade (deve ser capaz de lidar com algum ruído)
Todas as sugestões e sugestões são muito apreciadas!
fonte
Respostas:
Eu acho que você poderia obter o melhor desempenho em termos de taxa de erro de bits do demodulador (BER) com um loop de fase bloqueada. Você precisa ser rápido, no entanto. Eu acho que sua melhor aposta para um algoritmo rápido que ainda funciona razoavelmente bem é o cruzamento de zero.
Em uma nota lateral, eu gostaria de sugerir que você altere os 2200 Hz para 2400 Hz. Uma implementação ingênua do esquema de 1200/2200 Hz produziria descontinuidades, como visto cerca de dois terços no gráfico abaixo, onde os 2200 Hz passam para 1200 Hz.
Para minimizar a largura de banda usada e evitar descontinuidades que distorcem o sinal, você precisará tornar a fase contínua. Mesmo se você tornar a fase do transmissor contínua, ainda haverá o problema de que os símbolos de 2200 Hz nem sempre terão o mesmo número de cruzamentos de zero devido às diferentes fases. Geralmente eles terão quatro cruzamentos nulos, mas às vezes eles terão três. Os símbolos de 1200 Hz, por outro lado, sempre terão duas passagens de zero, porque a taxa de transmissão se divide uniformemente na frequência FSK.
Você pode resolver esses dois problemas alterando os 2200 Hz para 2400 Hz. Então os símbolos sempre começam e terminam em 0 graus (tornando-os automaticamente contínuos de fase) e sempre terão o mesmo número de cruzamentos zero - dois e quatro.
fonte
Fiz um decodificador para AFSK (padrão Bell 202) usando receptores de correlação para 1200 Hz e 2200 Hz, com resultados muito bons.
A amplitude resultante é bastante independente da fase do sinal e o SNR de saída é muito bom.
fonte
No caso de RTTY 45.45 baud, você também terá símbolos que não são um número inteiro de amostras, portanto, você precisa de uma função que possa ser chamada de cada amostra e, em seguida, sinalizar seu valor de retorno quando esse símbolo terminar. E você precisa de um acumulador de fase, que mantenha um registro constante de onde está a fase da onda senoidal.
Para enviar símbolos cujo comprimento não seja um múltiplo inteiro da taxa de amostragem, você precisa desta função ...
Para usá-lo, gere a próxima amostra de onda senoidal e chame essa função e verifique se o valor de retorno NÃO é igual a dois. Se não for igual a dois, avance para o próximo símbolo e decida se está enviando uma marca de espaço, depois chame essa função novamente dentro do bloco de código que será executado quando você descobrir que o valor de retorno não é igual a dois.
E aqui está o acumulador de fase do firmware Rockbox, com uma alteração para permitir alterações na amplitude (o volume total é 32767, o volume total fora de fase de 180 graus é -32768).
fonte