Преобразование CSV-файла Tektronix в звуковой формат |
![]() |
Добавил(а) microsin | ||
Осциллограф Tektronix MSO2014 может сохранить сигнал на флешку в файл формата CSV. Это стандартный, широко используемый текстовый формат для хранения таблиц [1], его можно загрузить в Microsoft Excel или просмотреть в текстовом редакторе. Но к сожалению, для звукового анализа такой формат подходит не очень хорошо. Лучше всего использовать файл в WAV-формате [2], тогда можно его прослушать, открыть в звуковом редакторе, просмотреть форму сигнала и оценить спектр. Для этой цели я написал утилиту конвертера, которая из CSV-файла Tektronix MSO2014 генерирует стандартный WAV-файл. Вот так выглядит начало CSV-файла осциллографа Tektronix MSO2014:
После строки 25 продолжается таблица до самого конца файла. В этом файле можно увидеть строки, у которых назначение следующее: 1, 2. Это общая информация об осциллографе (модель, прошивка). По второму и третьему столбцу табличных значений можно довольно просто синтезировать 32-битный, двухканальный WAV-файл, где каждое значение хранится в формате 32-битного числа с плавающей запятой одинарной точности (IEEE 754 Single-precision floating-point format [3]). [Заголовок WAV-файла] Ниже приведен код функции, который формирует в памяти (буфер в MemoryStream) данные заголовка. static void WriteWavHeader(ref MemoryStream stream, bool isFloatingPoint, ushort channelCount, ushort bitDepth, int sampleRate, int totalSampleCount) { stream.Position = 0; // RIFF header, идентификатор секции stream.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4); // Размер секции = размер файла - 8. stream.Write(BitConverter.GetBytes(((bitDepth / 8) * totalSampleCount) + 36), 0, 4); // Идентификатор секции формата stream.Write(Encoding.ASCII.GetBytes("WAVE"), 0, 4); // Подсекция 1, формат stream.Write(Encoding.ASCII.GetBytes("fmt "), 0, 4); // Размер подсекции формата 16. stream.Write(BitConverter.GetBytes(16), 0, 4); // Формат выборок звука (floating point (3) или PCM (1)). Любые другие значения // обозначают форматы со сжатием. stream.Write(BitConverter.GetBytes((ushort)(isFloatingPoint ? 3 : 1)), 0, 2); // Количество каналов. stream.Write(BitConverter.GetBytes(channelCount), 0, 2); // Частота выборок (Гц). stream.Write(BitConverter.GetBytes(sampleRate), 0, 4); // Частота следования байт. stream.Write(BitConverter.GetBytes(sampleRate * channelCount * (bitDepth / 8)), 0, 4); // Выравнивание блока. stream.Write(BitConverter.GetBytes((ushort)channelCount * (bitDepth / 8)), 0, 2); // Количество бит на одну выборку. stream.Write(BitConverter.GetBytes(bitDepth), 0, 2); // Подсекция 2, данные. stream.Write(Encoding.ASCII.GetBytes("data"), 0, 4); // Размер данных. stream.Write(BitConverter.GetBytes((bitDepth / 8) * totalSampleCount), 0, 4); //Дальше в файле должны идти данные оцифровки. } Для нашего примера эта функция должна быть вызвана со следующими параметрами: MemoryStream header = new MemoryStream();
double sampleInterval = 0.000016; int samples = 125000; WriteWavHeader(ref header, // поток для буфера данных заголовка true, // используется формат с плавающей запятой 2, // 2 канала 32, // 32 бита на каждую выборку (int)(1/sampleInterval), // частота дискретизации, Гц samples); // количество 2-канальных выборок Теперь в цикле нужно сформировать данные для WAV-файла. Выборки данных должны идти одна за другой, в таком порядке (будем использовать только столбцы REF1 и REF1 Peak Detect): выборка REF1 первой строки, потом выборка REF1 Peak Detect первой строки, потом выборка REF1 второй строки, потом выборка REF1 Peak Detect второй строки, и так далее, до последней 125000 строки. Полный код и скомпилированную программу можно скачать по ссылке [4]. [Использование csv2wav.exe] Пользоваться утилитой довольно просто. Без ключей она выводит подсказку по командной строке. Для преобразования нужно запустить csv2wav.exe с указанием имени преобразуемого файла. Имя выходного файла сгенерируется автоматически из имени входного, просто будет изменено расширение файла на *.wav. Если добавить опцию -i, то дополнительно будет выведена информация из заголовка CSV-файла Tektronix. C:\TEMP>csv2wav.exe
CSV to WAV converter (using with TEKTRONIX MSO2014 oscilloscope).
Published by microsin.net 180405.
Usage: csv2wav [-i] [csvfile] [wavfile]
C:\TEMP>csv2wav.exe -i t0000rf1.csv
Oscilloscope model MSO2014
Firmware 1.25
X units: S
X scale: 0.2s
Sample interlal: 0.000016s
Filter Frequency: 1e+08
Samples: 125000
Gating: 0.0% to 100.0%
Probe Attenuation: 1
Y units: V
Y offset: 0
Y scale: 2V
C:\TEMP>
[Ссылки] 1. Comma-separated values site:wikipedia.org. |