%% 清空缓存
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');