micsig .bin file 垂直档位部分debug.

2023-12-28 11:01:42

上图是一个现场记录的波形,直接用micsig bin2csv转换的结果

018:
Vertical Units,V,,2E-06,0.210000003129244
Vertical Scale,0.100000001490116,,2.4E-06,0.210000003129244
Vertical Offset,12,,2.8E-06,0.210000003129244
Probe Atten,0.200000002980232,,4E-06,0.206000003069639

探针当时按200mx设置,垂直档位是100mV,

这款示波器使用8位AD,当时的实际AD值大概是这样的:

Micsig,实际垂直方向8大格。一格按照bin2csv的注释,应该是:100mV*(1/0.2)?= 500mV.

所以,原配的csv2bin的读数未考虑探针实际减少的5倍关系。

f.seek(0x3c,0); vScale = struct.unpack('d', f.read(8))[0]; 这是电压档位。

其中:

0x3c位置:
>>>hex_string = '000000a09999b93f'
>>>float_val = struct.unpack('<d', bytes.fromhex(hex_string))[0]
>>> print(float_val)
0.10000000149011612?
这是垂直档位100mV

0x34位置:

>>> hex_string = '000000a09999c93f'
>>> float_val = struct.unpack('<d', bytes.fromhex(hex_string))[0]
>>> print(float_val)
0.20000000298023224

这是探针倍率,修改后的波形:

?这个值是对的。

相关的.bin2csv的代码:

# based on Micsig's offical code written by Matlab.
# python verison,
# first created at Aug18,2023
# v1.1.20231228
#    * 修改了垂直档位部分
# by Fengxh@zz
#
'''
#usage:
import sys
#micsig_binRead_fft所在的相对路径
sys.path.append("..")
import micsig_bin_read as micsig;

#usage:
#打印频谱:plot_spectrum(micsig_bin_file, resample_ratio);
micsig.plot_spectrum(r'2308230111.bin', 100);
#打印波形:draw_scope_ch_wave(micsig_bin_file, resample_ratio, False);
micsig.draw_scope_ch_wave(r'2308230112.bin', 1000, False)
'''

import struct #for structual read
import numpy as np #for array
import matplotlib.pyplot as plt #for plot.

'''
STO1004 header. input...v.
00000000h: 11 04 18 20 01 00 00 00 60 07 0B 01 04 00 00 00 ; ... ....`.......
00000010h: 00 00 00 00 00 00 00 00 BB 02 00 00 00 00 00 00 ; ........?......
00000020h: D0 12 33 41 00 00 00 00 00 00 00 00 FE FF FF FF ; ?3A........?
00000030h: 00 00 00 00 00 00 00 00 00 00 24 40 00 00 00 00 ; ..........$@....
00000040h: 00 00 14 40 00 00 00 00 00 00 F0 3F 00 00 00 00 ; ...@......?....
00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 ; ................
00000060h: 9A 99 99 99 99 99 B9 3F 0A 0F 9A 5D F7 D6 00 40 ; 殭櫃櫃?..歖髦.@
00000070h: 6E DB B6 6D DB E6 BB 40 80 1D 2C 04 01 00 00 00 ; n鄱m坻籃€.,.....
00000080h: 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; V...............
00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
'''
#return (x, wave, fs)
def scope_readwave_mini(file_name):
    with open(file_name, 'rb') as f:
        f.seek(4); iWaveType = struct.unpack('i', f.read(4))[0] #offset.04 4
        f.seek(8); length = struct.unpack('i', f.read(4))[0] #offset0.8 4
        #y_scale = struct.unpack('i', f.read(4))[0] #?
        #x_scale = struct.unpack('i', f.read(4))[0] #?
        #f.seek(12, 1) 
        f.seek(0x34,0); probeMul = struct.unpack('<d', f.read(8))[0] #?probe type? 0:curr?
        f.seek(0x38,0); probeMul1 = struct.unpack('f', f.read(4))[0] #?probe x,
        #f.seek(12, 1)
        #fs = struct.unpack('d', f.read(8))[0]
        #f.seek(4, 1)
        '''
        if iWaveType == 2:
            f.seek(12, 1)
            fft_f_step = struct.unpack('f', f.read(4))[0]
            f.seek(4, 1)
        else:
            f.seek(4 * 5, 1)
        '''
        #num = struct.unpack('i', f.read(4))[0]
        f.seek(4, 1) #the last 1: 0:head;1:current;2:end.
        f.seek(0x44,0); timeScale = struct.unpack('d', f.read(8))[0];  #offset0x44 8
        f.seek(0x3c,0); vScale = struct.unpack('<d', f.read(8))[0];
        print(">>>>>>vScale:%lf, probeMul=%lf"  %(vScale, probeMul))
        vScale = vScale /probeMul / 50
        DataBits = struct.unpack('i', f.read(4))[0]
        
        f.seek(256)
        wave = np.frombuffer(f.read(length * 4), dtype=np.int32)
    
    fs = wave.size/(14*timeScale);
    x = np.arange(wave.size)
    x = x / fs
    #vScale = 1;
    wave = wave * vScale

    print(file_name,'total pt=', len(x), 'fs=', fs); 
    return (x, wave, fs)


def draw_scope_ch_wave(filename, re_sample_ratio, isWithFFT):
    percentStart = 50;
    percentStop = 100;

    #read
    (x,wave,fs) = scope_readwave_mini(filename);
    
    #sample
    x = x[::re_sample_ratio]; 
    y = wave[::re_sample_ratio];
    print('draw wave after sample: pt=', len(x));

    #截断
    lenPrev = len(x);
    startPt = int(percentStart*1.0*lenPrev/100);
    stopPt = int(percentStop*1.0*lenPrev/100);
    x = x[startPt:stopPt];
    y = y[startPt:stopPt];
    print('draw wave after slice: pt=', len(x), 'start pt=', startPt, ',stop pt=', stopPt);

    
    #plot it
    # 绘制波形图
    plt.figure(figsize=(8, 6))  # 设置画布大小,可根据需要调整
    plt.plot(x, y, color='blue', label='Waveform')  # 绘制波形曲线
    plt.xlabel('Time')  # 设置 x 轴标签
    plt.ylabel('Amplitude')  # 设置 y 轴标签
    plt.title('Waveform Plot' + '-' + filename)  # 设置图表标题
    plt.grid(True)  # 显示网格线
    plt.legend()  # 显示图例
    plt.show()  # 显示图形

#file, ratio, start, stop
def plot_spectrum(filename, re_sample_ratio):
    percentStart = 50;
    percentStop = 100;    
    #read
    (x,wave,fs) = scope_readwave_mini(filename);
     
    
    #sample
    print("pre x_max = %f, fs=%f;", x[-1], fs);
    x = x[::re_sample_ratio]; 
    y = wave[::re_sample_ratio];
    sampling_rate = fs/re_sample_ratio;
    signal = y;
    print("pos resampled(1:%d), x_max = %f, fs=%f", re_sample_ratio,  x[-1], sampling_rate);

    #截断
    lenPrev = len(x);
    startPt = int(percentStart*1.0*lenPrev/100);
    stopPt = int(percentStop*1.0*lenPrev/100);
    x = x[startPt:stopPt];
    y = y[startPt:stopPt];

    # 计算FFT
    fft_result = np.fft.fft(signal)
    # 移动FFT结果,使得负数频率位于两侧
    shifted_fft = np.fft.fftshift(fft_result)
    # 计算频率轴
    freq_axis = np.fft.fftshift(np.fft.fftfreq(len(signal), 1/sampling_rate))
    # 取FFT结果的绝对值
    spectrum = np.abs(shifted_fft)

    # 绘制频谱图
    plt.figure(figsize=(8, 4))
    plt.plot(freq_axis, spectrum)
    plt.title('Signal Spectrum')
    plt.xlabel('Frequency (Hz)')
    plt.ylabel('Amplitude')
    plt.grid(True)
    plt.show()
'''
%attachment code in Matlab version.
%% 读取micsig mini示波器波形文件,包括wav文件和bin文件
% file_name: 波形文件的文件名
% x:返回波形数据x轴;
% y:返回波形数据y轴;
function [x,wave] = scope_readwave_mini(file_name)
fid1 = fopen(file_name,'r');
wave = [];
x = [];
if(fid1>0)
    fseek(fid1, 16, 'bof'); 
    iWaveType = fread(fid1, 1, 'int32');
    len = fread(fid1, 1, 'int32');
    y_scale = fread(fid1, 1, 'int32');
    x_scale = fread(fid1, 1, 'int32');
    fseek(fid1, 12, 'cof');
    probeType = fread(fid1, 1, 'int32');
    probeMul = fread(fid1, 1, 'float32');
    fseek(fid1, 12, 'cof');
    fs = fread(fid1, 1, 'float64');
    fseek(fid1, 4, 'cof');
    if(iWaveType == 2)
        fseek(fid1, 12, 'cof');
        fft_f_step = fread(fid1, 1, 'float32');
        fseek(fid1, 4, 'cof');
    else
        fseek(fid1, 4*5, 'cof');
    end
    num = fread(fid1, 1, 'int32');
    fseek(fid1, 4, 'cof');
    timeScale = fread(fid1, 1, 'float64');
    vScale = fread(fid1, 1, 'float64')*probeMul/50;
    DataBits = fread(fid1, 1, 'int32');
    
    fseek(fid1, 200, 'bof'); 
    if(DataBits == 32)
        [wave,cnt] = fread(fid1, len, 'int32');
    else
        [wave,cnt] = fread(fid1, len, 'int16');
    end
else
    return;
end
x = 0:cnt-1;
if(iWaveType == 2)
    x = x*fft_f_step;
else
    x = x./fs;
end
wave = wave*vScale;
'''

?

?

文章来源:https://blog.csdn.net/twicave/article/details/135259439
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。