Есть ли более быстрый способ чтения, преобразования и преобразования двоичного файла? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть двоичный файл, который содержит определенное количество семплов, и каждый семпл содержит четыре байта. Данные получают через 14-битные АЦП, и у меня есть следующее назначение битов: b31-b29 = не используется, b28 = цифровой вход, b27-b14 = chB (подписано), b13-b0 = chA (подписано). В конце я хочу выполнить БПФ для chA и chB. Чтобы добраться туда, я использую следующий Python код:

1. Здесь файл двоичных данных открывается как цепочка битов, и выборки, то есть 516x1024x32x32 бит, считываются и добавляются в битовый массив. Это делается путем считывания одной выборки (4 байта или 32 бита) за раз, инвертирования порядка байтов и последующего помещения этой цепочки битов в массив битов. Это повторяется для всех образцов:

swap = BitArray()

f = ConstBitStream(filename='data.kbin')
f.pos = 0
samples = 516*1024*32
sample_rate = 30517.578125

for i in range(samples):
    data = BitArray()
    g = f.read('bits:32')
    data.append(g)
    data.byteswap(4)
    swap.append(data)

2. Вновь упорядоченный массив снова открывается как цепочка битов:

data2 = ConstBitStream(swap)

3. Строка битов теперь считывается таким образом, что применяется правильное назначение битов (как показано выше), и каждая битовая строка преобразуется в целое число со знаком. Также каждое целое число, относящееся к chA и chB, заносится в соответствующий список:

chA = []
chB = []

data2.pos = 0
for i in range(samples):
    a = data2.read('int:3')
    b = data2.read('int:1')
    c = data2.read('int:14')
    d = data2.read('int:14')
    chA.append(d)
    chB.append(c)

4. Вычисление БПФ:

dt = 1 / sample_rate

yf_A = fftpack.rfft(chA)
yf_B = fftpack.rfft(chB)
xf = fftpack.rfftfreq(samples, dt)

Этот код работает, и я получаю желаемый результат, но это занимает очень много времени. Первый шаг занимает почти 10 минут, а третий около 3 минут. Я совершенно новичок в Python, поэтому мои знания довольно малы. Как я могу ускорить процесс? Спасибо.

...