
O título desta pergunta já está muito claro, eu questiono. Quero ler um arquivo wav e obter pulsos como 1 e silêncio como 0 e sua duração em microssegundos.
A razão é esta: gravei um sinal demolido de 433 MHz de um sistema de navegação automotiva (usando um protocolo desconhecido). O wav é amplificado (recorte) para endireitar as linhas e um deslocamento DC é adicionado para torná-lo uma onda quadrada PWM perfeita (no Audacity):
Baixei o aplicativo CLI, sox
porém estou sobrecarregado com a quantidade de opções, não sei por onde começar, na verdade. É claro que estou procurando uma solução on-line sobre como fazer isso, mas não consigo encontrar nada.
Três perguntas:
- É possível o que eu quero fazer?
- Quais opções de linha de comando preciso usar?
- O sox pode fazer o que fiz com o Audicity (para poder automatizar o processo em um arquivo em lote)?
Exemplo de saída (bit, duração):
0,255
1,100
0,50
1,200
etc.
Essas 'tabelas' podem ser facilmente usadas para criar arrays em C/C++, para usar com um microcontrolador para finalmente imitar o controle remoto.
Alguma sugestão?
Responder1
Presumo que seus dados estejam em algum tipo de arquivo de texto como um CSV.... Ler um arquivo WAV é um pouco mais difícil. Você pode encontrar uma ferramenta WAV para CSV ou WAV para TXT em algum lugar para essa etapa.
Está envolvida alguma pequena programação, fácil de fazer por qualquer pessoa que tenha feito alguns meses de curso de programação (ou seja, criança) :)
Você precisa capturar os dados em pedaços de microssegundos e fazer um MAX() e um MIN() dessas amostras. Não é muito difícil de fazer em VBA, C ou Python ou algo assim. Existem maneiras mais sofisticadas de fazer isso com muito mais precisão, mas nada que eu possa escrever em 60 segundos. MAX()-MIN() abaixo de um limite deve funcionar
Se você se preocupa com os 3 sinais anteriores, eles seriam preferencialmente em torno de um microssegundo para serem facilmente filtráveis na próxima etapa
Conte pequenos valores consecutivos (abaixo do limite) do anterior e isso fornecerá a saída desejada. Como você já limpou alguns dados, esse limite provavelmente deve ser 1/2 da escala total. Imprima os valores MAX e MIN algumas vezes para saber seus valores aproximados
Existem também rotinas simples de detecção de bordas que podem informar a frequência exata (na verdade, apenas o período) de cada onda no sinal. Apenas mais codificação.
Responder2
Aqui está a pergunta que leva a uma solução: https://stackoverflow.com/questions/42541588/any-way-i-can-get-sox-to-just-print-the-amplitude-values-from-a-wav-file
A sintaxe é:
sox file.wav -t dat file.txt
Suponho que isso não seja muito difícil de dizer para alguém que usa Sox com frequência. De qualquer forma, isso produz um arquivo com conteúdo como este (posição temporal => amplitude):
; Sample Rate 44100
; Channels 1
0 0.99996948242
2.2675737e-005 0.99987792969
4.5351474e-005 0.99996948242
6.8027211e-005 0.99981689453
9.0702948e-005 0.99996948242
0.00011337868 0.99993896484
0.00013605442 0.99996948242
0.00015873016 0.99996948242
0.0001814059 0.99996948242
0.00020408163 0.99996948242
0.00022675737 0.99996948242
0.00024943311 0.99996948242
0.00027210884 0.99990844727
0.00029478458 0.99996948242
0.00031746032 0.99981689453
0.00034013605 0.99996948242
0.00036281179 0.99984741211
0.00038548753 0.99996948242
0.00040816327 0.99993896484
......
......
1.0236961 -0.0077819824219
1.0237188 -0.0081176757813
1.0237415 -0.0078735351563
1.0237642 -0.0079650878906
Ainda assim, a saída precisa de algum trabalho, existem alguns valores exponenciais estranhos no início e a saída precisa ser calculada para ser utilizável. Já fiz algo em PHP para analisar isso.
É muito estranho que seja tão difícil obter informações sobre ondas, pois a maioria na web é limitada. incompleto, desatualizado ou não funcionando.