Sox: wav를 읽고 펄스를 1로, 무음을 0으로, 지속 시간을 마이크로초 단위로 가져옵니다.

Sox: wav를 읽고 펄스를 1로, 무음을 0으로, 지속 시간을 마이크로초 단위로 가져옵니다.

이 질문의 제목은 이미 매우 명확합니다. wav 파일을 읽고 펄스를 1로, 침묵을 0으로, 지속 시간을 마이크로초 단위로 얻고 싶습니다.

그 이유는 자동차 내비게이션 시스템에서 (알 수 없는 프로토콜을 사용하여) 디뮤타티드 433Mhz 신호를 녹음했기 때문입니다. WAV는 증폭(클리핑)되어 선을 직선화하고 DC 오프셋을 추가하여 완벽한 PWM 구형파(Audacity)로 만듭니다.

여기에 이미지 설명을 입력하세요

CLI 애플리케이션을 다운로드했지만 sox옵션의 양에 압도되어 실제로 어디서부터 시작해야 할지 모르겠습니다. 물론 온라인에서 이 작업을 수행하는 방법에 대한 솔루션을 검색했지만 아무 것도 찾을 수 없습니다.

세 가지 질문:

  • 내가 하고 싶은 일이 가능할까?
  • 어떤 명령줄 옵션을 사용해야 합니까?
  • 내가 Audicity로 했던 일(배치 파일에서 프로세스를 자동화하기 위해)을 Sox가 수행할 수 있습니까?

출력 예(비트, 기간):

0,255
1,100
0,50
1,200
etc.

이러한 '테이블'은 C/C++에서 배열을 생성하고 마이크로 컨트롤러와 함께 사용하여 최종적으로 원격 제어를 모방하는 데 쉽게 사용할 수 있습니다.

어떤 제안이 있으십니까?

답변1

귀하의 데이터가 CSV와 같은 일종의 텍스트 파일에 있다고 가정합니다.... WAV 파일을 읽는 것은 꽤 어렵습니다. 해당 단계 어딘가에서 WAV to CSV 또는 WAV to TXT 도구를 찾을 수 있습니다.

몇 가지 작은 프로그래밍이 포함되어 있어 몇 달간 프로그래밍 과정을 이수한 사람(예: 어린이) 누구나 쉽게 할 수 있습니다. :)

마이크로초 단위로 데이터를 수집하고 해당 샘플에 대해 MAX() 및 MIN()을 수행해야 합니다. VBA나 C, Python 등에서는 그렇게 어렵지 않습니다. 이를 훨씬 더 정확하게 수행할 수 있는 더 정교한 방법이 있지만 60초 안에 작성할 수 있는 방법은 없습니다. 임계값 미만의 MAX()-MIN()이 작동해야 합니다.

3개의 블립에 관심이 있다면 다음 단계에서 쉽게 필터링할 수 있도록 마이크로초 정도가 바람직합니다.

이전 값에서 연속된 작은 값(임계값 미만)을 계산하면 원하는 출력을 얻을 수 있습니다. 이미 일부 데이터를 정리했으므로 이 임계값은 전체 규모의 1/2이 될 것입니다. 대략적인 값을 알 수 있도록 MAX 및 MIN 값을 몇 번 인쇄해 보세요.

신호의 각 파동에 대한 정확한 주파수(실제로는 주기)를 거의 알려줄 수 있는 간단한 에지 감지 루틴도 있습니다. 코딩만 더 하면 됩니다.

답변2

해결책으로 이어지는 질문은 다음과 같습니다. https://stackoverflow.com/questions/42541588/any-way-i-can-get-sox-to-just-print-the-amplitude-values-from-a-wav-file

구문은 다음과 같습니다

sox file.wav -t dat file.txt

나는 이것이 양말을 자주 사용하는 누군가에게 말하기가 그리 어렵지 않다고 생각합니다. 어쨌든 다음과 같은 내용이 포함된 파일이 생성됩니다(시간 위치 => 진폭).

; 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 

여전히 출력에는 약간의 작업이 필요하고, 처음에는 이상한 지수 값이 있으며, 사용하려면 출력을 계산해야 합니다. 나는 이것을 분석하기 위해 이미 PHP로 뭔가를 만들었습니다.

파동 정보를 얻기가 너무 어렵다는 것은 매우 이상합니다. 웹에서는 대부분 제한되어 있습니다. 불완전하거나 오래되었거나 작동하지 않습니다.

관련 정보