%% ================================ 原始数据&滤波参数调整 ===========================================================
% 可调节参数
Mid_alpha_double = 0.6;
High_alpha_double = 0.25;
Low_alpha_double = 0.55;
limit_up = 75;
limit_down = 50;
Avgwindow = 12;
K = 1 + 1/4;
K2 = 1 + 1/4;
K3 = 1 + 1/4;
Save_Path = 'C:\Users\haora\Desktop\MATLAB\TOUCH\PROCESSED_DATA\多频点滤波验证\多频点滤波结果 1.csv';
raw_1MHz_data = My_readExcelColumn("动态3v 2.xlsx" , "动态3v 2" ,"I0");
raw_13MHz_data = My_readExcelColumn("动态3v 2.xlsx" , "动态3v 2" ,"I1");
Freq1MHz_Point = Touch_Filter( raw_1MHz_data );
Freq13MHz_Point = Touch_Filter( raw_13MHz_data );
Freq1MHz_Point = Freq1MHz_Point.setParameters(Mid_alpha_double , High_alpha_double , Low_alpha_double ...
,limit_up , limit_down , Avgwindow , K ,Save_Path);
Freq13MHz_Point = Freq13MHz_Point.setParameters(Mid_alpha_double , High_alpha_double , Low_alpha_double ...
,limit_up , limit_down , Avgwindow , K ,Save_Path);
Freq1MHz_Point.Process(1);
Freq13MHz_Point.Process(2);
%% ================================ 比较器函数及保存 ===========================================================
% 类定义
Comper1MHz_Point = TouchComper();
Comper13MHz_Point = TouchComper();
% 关键数组
lenth = Freq1MHz_Point.len ;
lenth13 = Freq13MHz_Point.len ;
% 峰值
Comper1MHz_Point_PeakValue = zeros(1,lenth,"double");
Comper13MHz_Point_PeakValue = zeros(1,lenth13,"double");
% 极性
Comper1MHz_Point_hiddenPolarity = zeros(1,lenth,"double");
Comper13MHz_Point_hiddenPolarity = zeros(1,lenth13,"double");
% 计时器
Comper1MHz_Point_TimeCount = zeros(1,lenth,"double");
Comper13MHz_Point_TimeCount = zeros(1,lenth13,"double");
% 震荡计数器
Comper1MHz_Point_TSD_ShakeCnt = zeros(1,lenth,"double");
Comper13MHz_Point_TSD_ShakeCnt = zeros(1,lenth13,"double");
% FIFO的和
Comper1MHz_Point_FifoSum = zeros(1,lenth,"double");
Comper13MHz_Point_FifoSum = zeros(1,lenth13,"double");
% 当前触摸状态
Comper1MHz_Point_CurrentTouchSt = zeros(1,lenth,"double");
Comper13MHz_Point_CurrentTouchSt = zeros(1,lenth13,"double");
% 过去触摸状态
Comper1MHz_Point_PurrentTouchSt = zeros(1,lenth,"double");
Comper13MHz_Point_PurrentTouchSt = zeros(1,lenth13,"double");
% 运算
for i = 1 : lenth
FilterResult1 = Freq1MHz_Point.ResultDta(i);
Comper1MHz_Point.New_TouchTheComparatorFunction(FilterResult1);
% 峰值
Comper1MHzclc_Point_PeakValue(i) = Comper1MHz_Point.PeakValue;
% 极性
Comper1MHz_Point_hiddenPolarity(i) = Comper1MHz_Point.hiddenPolarity;
% 计时器
Comper1MHz_Point_TimeCount(i) = Comper1MHz_Point.TimeCount;
% 震荡计数器
Comper1MHz_Point_TSD_ShakeCnt(i) = Comper1MHz_Point.TSD_ShakeCnt;
% FIFO的和
Comper1MHz_Point_FifoSum(i) = Comper1MHz_Point.Fifo_Sum;
% 当前触摸状态
Comper1MHz_Point_CurrentTouchSt(i) = Comper1MHz_Point.Current_TouchSt;
% 过去触摸状态
Comper1MHz_Point_PurrentTouchSt(i) = Comper1MHz_Point.previous_TouchSt;
end
for i = 1 : lenth13
FilterResult2 = Freq13MHz_Point.ResultDta(i);
Comper13MHz_Point.New_TouchTheComparatorFunction(FilterResult2);
% 峰值
Comper13MHz_Point_PeakValue(i) = Comper13MHz_Point.PeakValue + 100 ;
% 极性
Comper13MHz_Point_hiddenPolarity(i) = Comper13MHz_Point.hiddenPolarity + 100 ;
% 计时器
Comper13MHz_Point_TimeCount(i) = Comper13MHz_Point.TimeCount + 100 ;
% 震荡计数器
Comper13MHz_Point_TSD_ShakeCnt(i) = Comper13MHz_Point.TSD_ShakeCnt + 100 ;
% FIFO的和
Comper13MHz_Point_FifoSum(i) = Comper13MHz_Point.Fifo_Sum + 100 ;
% 当前触摸状态
Comper13MHz_Point_CurrentTouchSt(i) = Comper13MHz_Point.Current_TouchSt + 100 ;
% 过去触摸状态
Comper13MHz_Point_PurrentTouchSt(i) = Comper13MHz_Point.previous_TouchSt + 100 ;
end
%% =========================================================== 数据保存
% 元胞数组转换
% 峰值
Comper1MHz_Point_PeakValue_col = row2col(Comper1MHz_Point_PeakValue);
Comper13MHz_Point_PeakValue_col = row2col(Comper13MHz_Point_PeakValue);
% 极性
Comper1MHz_Point_hiddenPolarity_col = row2col(Comper1MHz_Point_hiddenPolarity);
Comper13MHz_Point_hiddenPolarity_col = row2col(Comper13MHz_Point_hiddenPolarity);
% 计时器
Comper1MHz_Point_TimeCount_col = row2col(Comper1MHz_Point_TimeCount);
Comper13MHz_Point_TimeCount_col = row2col(Comper13MHz_Point_TimeCount);
% 震荡计数器
Comper1MHz_Point_TSD_ShakeCnt_col = row2col(Comper1MHz_Point_TSD_ShakeCnt);
Comper13MHz_Point_TSD_ShakeCnt_col = row2col(Comper13MHz_Point_TSD_ShakeCnt);
% FIFO的和
Comper1MHz_Point_FifoSum_col = row2col(Comper1MHz_Point_FifoSum);
Comper13MHz_Point_FifoSum_col = row2col(Comper13MHz_Point_FifoSum);
% 当前触摸状态
Comper1MHz_Point_CurrentTouchSt_col = row2col(Comper1MHz_Point_CurrentTouchSt);
Comper13MHz_Point_CurrentTouchSt_col = row2col(Comper13MHz_Point_CurrentTouchSt);
% 过去触摸状态
Comper1MHz_Point_PurrentTouchSt_col = row2col(Comper1MHz_Point_PurrentTouchSt);
Comper13MHz_Point_PurrentTouchSt_col = row2col(Comper13MHz_Point_PurrentTouchSt);
% 写入CSV文件
writeColumnToCSV(Save_Path, Comper1MHz_Point_PeakValue_col, 11);
writeColumnToCSV(Save_Path, Comper1MHz_Point_hiddenPolarity_col, 12);
writeColumnToCSV(Save_Path, Comper1MHz_Point_TimeCount_col, 13);
writeColumnToCSV(Save_Path, Comper1MHz_Point_FifoSum_col, 14);
writeColumnToCSV(Save_Path, Comper1MHz_Point_TSD_ShakeCnt_col, 15);
writeColumnToCSV(Save_Path, Comper1MHz_Point_CurrentTouchSt_col, 16);
writeColumnToCSV(Save_Path, Comper1MHz_Point_PurrentTouchSt_col, 17);
writeColumnToCSV(Save_Path, Comper13MHz_Point_PeakValue_col, 18);
writeColumnToCSV(Save_Path, Comper13MHz_Point_hiddenPolarity_col, 19);
writeColumnToCSV(Save_Path, Comper13MHz_Point_TimeCount_col, 20);
writeColumnToCSV(Save_Path, Comper13MHz_Point_TSD_ShakeCnt_col, 21);
writeColumnToCSV(Save_Path, Comper13MHz_Point_FifoSum_col, 22);
writeColumnToCSV(Save_Path, Comper13MHz_Point_CurrentTouchSt_col, 23);
writeColumnToCSV(Save_Path, Comper13MHz_Point_PurrentTouchSt_col, 24);
%% ================================ 置信函数相关 ===========================================================
% 置信函数相关参数
% 当前信任频点
%
function writeColumnToCSV(filename, data, columnIndex)
% WRITECOLUMNTOCSV 将数组写入CSV文件的指定列,支持自定义路径
% 参数:
% filename - 字符串,目标CSV文件完整路径(例如 'C:\data\results.csv')
% data - 数值数组、字符串数组或字符元胞数组
% columnIndex - 正整数,指定数据写入的列号(从1开始)
%
% 新增功能:
% 1. 支持完整文件路径输入
% 2. 自动创建缺失的目录
% =============== 参数验证 ===============
try
if ~ischar(filename) || isempty(filename)
error('文件名必须是非空字符串');
end
% 检查路径合法性
[filepath, ~, ext] = fileparts(filename);
if isempty(ext)
error('文件名必须包含扩展名(如 .csv)');
end
if ~isnumeric(columnIndex) || columnIndex < 1 || mod(columnIndex,1) ~= 0
error('列号必须是大于0的整数');
end
if ~isnumeric(data) && ~iscellstr(data) && ~isstring(data)
error('数据必须是数值数组、字符串数组或字符元胞数组');
end
data = data(:);
numRows = length(data);
catch ME
fprintf('参数错误: %s\n', ME.message);
rethrow(ME);
end
% =============== 目录创建 ===============
% 新增功能:自动创建缺失目录
if ~isempty(filepath) && ~isfolder(filepath)
try
mkdir(filepath);
fprintf('创建目录: %s\n', filepath);
catch ME
error('目录创建失败: %s', ME.message);
end
end
% =============== 文件处理 ===============
try
% 读取现有文件或初始化
if exist(filename, 'file') == 2
fileCell = readcell(filename);
% 将missing类型转换为空字符串
for i = 1:numel(fileCell)
try
if ismissing(fileCell{i})
fileCell{i} = '';
end
catch
continue; % 跳过不支持ismissing的类型
end
end
else
fileCell = {};
end
[currentRows, currentCols] = size(fileCell);
% 扩展列数
if columnIndex > currentCols
fileCell(:, end+1:columnIndex) = {''};
[currentRows, currentCols] = size(fileCell);
end
% 扩展行数
if numRows > currentRows
fileCell(end+1:numRows, 1:currentCols) = {''};
end
% 数据转换
if isnumeric(data)
dataCell = num2cell(data);
for i = 1:numel(dataCell)
if isnumeric(dataCell{i}) && isnan(dataCell{i})
dataCell{i} = '';
end
end
elseif isstring(data)
dataCell = cellstr(data);
else
dataCell = data;
end
% 数据写入
fileCell(1:numRows, columnIndex) = dataCell;
writecell(fileCell, filename);
fprintf('成功写入 %d 行数据到 %s 的第 %d 列\n', ...
numRows, filename, columnIndex);
catch ME
fprintf('文件操作错误: %s\n', ME.message);
rethrow(ME);
end
end
如何提高写入的速度
最新发布