当前位置:首页 > Software > Matlab > 正文内容

普源示波器csv文件读取程序 Matlab 计算FFT 去除直流偏执

chanra1n5天前Matlab48
%% 清空缓存
clc; clear; close all;
%% 参数定义
% 通道选择 (1: 启用, 0: 禁用)
enable_CH1 = 1; % 通道1
enable_CH2 = 1; % 通道2
enable_CH3 = 0; % 通道3
enable_CH4 = 0; % 通道4
% 是否去除偏置 (1: 去除, 0: 不去除)
remove_offset_CH1 = 0; % 通道1
remove_offset_CH2 = 0; % 通道2
remove_offset_CH3 = 0; % 通道3
remove_offset_CH4 = 0; % 通道4
% 是否显示波形 (1: 显示, 0: 不显示)
show_waveforms = 1; % 是否显示波形
% 是否计算频谱 (1: 计算, 0: 不计算)
calculate_spectrum = 1; % 是否计算频谱
% 是否显示频谱 (1: 显示, 0: 不显示)
show_spectrum = 1; % 是否显示频谱
% 通道倍率
gain_CH1 = 1000;  % 通道1,探头倍率
gain_CH2 = 1000;   % 通道2,探头倍率
gain_CH3 = -500; % 通道3,探头倍率
gain_CH4 = 20;   % 通道4,探头倍率
% 时间增量和初始时间
tInc = 1 / 125e6; % 时间增量
t0 = -1.00000e-03; % 初始时间
% 计算偏差的时间
offset_calc_duration = 0.1; % 计算偏差的时长(秒)
%% 读取CSV文件
filename = 'timepf2lp0.csv';
data = readmatrix(filename, 'NumHeaderLines', 1);
% 计算时间轴
time = t0:tInc:(t0 + tInc * (size(data, 1) - 1));
% 提取各个通道的数据和计算偏置
if enable_CH1
    CH1V = data(:, 1) * gain_CH1; % 通道1
    offset_time_idx = find(time <= time(1) + offset_calc_duration); % 找到前偏置值的索引
    if remove_offset_CH1
        offset_CH1V = mean(CH1V(offset_time_idx)); % 计算CH1V的偏置值
        CH1V = CH1V - offset_CH1V;
    end
else
    CH1V = []; % 通道1未启用,清空变量
end
if enable_CH2
    CH2V = data(:, 2) * gain_CH2; % 通道2
    offset_time_idx = find(time <= time(1) + offset_calc_duration); % 找到前偏置值的索引
    if remove_offset_CH2
        offset_CH2V = mean(CH2V(offset_time_idx)); % 计算CH2V的偏置值
        CH2V = CH2V - offset_CH2V;
    end
else
    CH2V = []; % 通道2未启用,清空变量
end
if enable_CH3
    CH3V = data(:, 3) * gain_CH3; % 通道3
    offset_time_idx = find(time <= time(1) + offset_calc_duration); % 找到前偏置值的索引
    if remove_offset_CH3
        offset_CH3V = mean(CH3V(offset_time_idx)); % 计算CH3V的偏置值
        CH3V = CH3V - offset_CH3V;
    end
else
    CH3V = []; % 通道3未启用,清空变量
end
if enable_CH4
    CH4A = data(:, 4) * gain_CH4; % 通道4
    offset_time_idx = find(time <= time(1) + offset_calc_duration); % 找到前偏置值的索引
    if remove_offset_CH4
        offset_CH4A = mean(CH4A(offset_time_idx)); % 计算CH4A的偏置值
        CH4A = CH4A - offset_CH4A;
    end
else
    CH4A = []; % 通道4未启用,清空变量
end
% 绘制波形
if show_waveforms
    figure;
    if enable_CH1
        subplot(4, 1, 1);
        plot(time, CH1V);
        title('Channel 1 Voltage');
        xlabel('Time (s)');
        ylabel('Voltage (V)');
    end
    if enable_CH2
        subplot(4, 1, 2);
        plot(time, CH2V);
        title('Channel 2 Voltage');
        xlabel('Time (s)');
        ylabel('Voltage (V)');
    end
    if enable_CH3
        subplot(4, 1, 3);
        plot(time, CH3V);
        title('Channel 3 Voltage');
        xlabel('Time (s)');
        ylabel('Voltage (V)');
    end
    if enable_CH4
        subplot(4, 1, 4);
        plot(time, CH4A);
        title('Channel 4 Current');
        xlabel('Time (s)');
        ylabel('Current (A)');
    end
    % 调整图像布局
    sgtitle('Oscilloscope Waveforms');
end
%% 计算频谱
if calculate_spectrum
    Fs = 1 / tInc; % 采样率
    N = length(data); % 数据长度
    f = (0:N-1)*(Fs/N); % 计算频率轴
    % 绘制 FFT 图像
    if show_spectrum
        figure;
        if enable_CH1
            Y1 = fft(CH1V) / N; % 计算CH1V信号的FFT,并进行归一化
            idx = find(f >= 0 & f <= 20e6); % 找到频率在0Hz到20MHz之间的索引
            subplot(4, 1, 1);
            Y1_single_sided = 2*abs(Y1(idx)); % 计算CH1V信号的单边谱,并乘以2
            Y1_single_sided(1) = abs(Y1(idx(1))); % DC 分量不乘以2
            if mod(N, 2) == 0
                Y1_single_sided(end) = abs(Y1(idx(end))); % fs/2 分量不乘以2
            end
            plot(f(idx), Y1_single_sided);
            title('CH1V FFT');
            xlabel('Frequency (Hz)');
            ylabel('Amplitude (V)');
        end
        if enable_CH2
            Y2 = fft(CH2V) / N; % 计算CH2V信号的FFT,并进行归一化
            idx = find(f >= 0 & f <= 20e6); % 找到频率在0Hz到20MHz之间的索引
            subplot(4, 1, 2);
            Y2_single_sided = 2*abs(Y2(idx)); % 计算CH2V信号的单边谱,并乘以2
            Y2_single_sided(1) = abs(Y2(idx(1))); % DC 分量不乘以2
            if mod(N, 2) == 0
                Y2_single_sided(end) = abs(Y2(idx(end))); % fs/2 分量不乘以2
            end
            plot(f(idx), Y2_single_sided);
            title('CH2V FFT');
            xlabel('Frequency (Hz)');
            ylabel('Amplitude (V)');
        end
        if enable_CH3
            Y3 = fft(CH3V) / N; % 计算CH3V信号的FFT,并进行归一化
            idx = find(f >= 0 & f <= 20e6); % 找到频率在0Hz到20MHz之间的索引
            subplot(4, 1, 3);
            Y3_single_sided = 2*abs(Y3(idx)); % 计算CH3V信号的单边谱,并乘以2
            Y3_single_sided(1) = abs(Y3(idx(1))); % DC 分量不乘以2
            if mod(N, 2) == 0
                Y3_single_sided(end) = abs(Y3(idx(end))); % fs/2 分量不乘以2
            end
            plot(f(idx), Y3_single_sided);
            title('CH3V FFT');
            xlabel('Frequency (Hz)');
            ylabel('Amplitude (V)');
        end
        if enable_CH4
            Y4 = fft(CH4A) / N; % 计算CH4A信号的FFT,并进行归一化
            idx = find(f >= 0 & f <= 20e6); % 找到频率在0Hz到20MHz之间的索引
            subplot(4, 1, 4);
            Y4_single_sided = 2*abs(Y4(idx)); % 计算CH4A信号的单边谱,并乘以2
            Y4_single_sided(1) = abs(Y4(idx(1))); % DC 分量不乘以2
            if mod(N, 2) == 0
                Y4_single_sided(end) = abs(Y4(idx(end))); % fs/2 分量不乘以2
            end
            plot(f(idx), Y4_single_sided);
            title('CH4A FFT');
            xlabel('Frequency (Hz)');
            ylabel('Amplitude (A)');
        end
        % 调整图像布局
        sgtitle('FFT Results');
    end
end
%% 生成用于Simulink的电压和电流数据
% 时间序列
x = time';
vol_for_sim_CH1V = enable_CH1 * [x, CH1V];
vol_for_sim_CH2V = enable_CH2 * [x, CH2V];
vol_for_sim_CH3V = enable_CH3 * [x, CH3V];
cur_for_sim_CH4A = enable_CH4 * [x, CH4A];
% 保存数据到 .mat 文件中
% save('sim_data.mat', 'vol_for_sim_CH1V', 'vol_for_sim_CH2V', 'vol_for_sim_CH3V', 'cur_for_sim_CH4A');

image.png

扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://myfpga.cn/index.php/post/430.html

分享给朋友:
返回列表

没有更早的文章了...

没有最新的文章了...

“普源示波器csv文件读取程序 Matlab 计算FFT 去除直流偏执” 的相关文章