
Название этого вопроса, я полагаю, уже предельно ясно. Я хочу прочитать wav-файл и получить импульсы как 1, а тишину как 0 и ее длительность в микросекундах.
Причина в следующем: я записал демодулированный сигнал 433 МГц с автомобильной навигационной системы (используя неизвестный протокол). WAV усиливается (обрезается) для выпрямления линий, и добавляется смещение постоянного тока, чтобы сделать его идеальным прямоугольным сигналом ШИМ (в Audacity):
Скачал приложение cli sox
, но ошеломлен количеством опций, не знаю, с чего начать, правда. Конечно, ищу решение в сети, как это сделать, однако ничего не могу найти.
Три вопроса:
- Возможно ли то, что я хочу сделать?
- Какие параметры командной строки мне необходимо использовать?
- Может ли sox сделать то, что я сделал с Audicity (автоматизировать процесс в пакетном файле)?
Пример вывода (бит, длительность):
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
Я полагаю, что это не очень трудно сказать тому, кто часто использует sox. В любом случае, это создает файл с таким содержимым (позиция времени => амплитуда):
; 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, чтобы разобрать это.
Очень странно, что так сложно получить информацию о волнах, большая часть информации в Интернете ограничена: она неполная, устаревшая или нерабочая.