obj

博客指出obj文件里f的vertices的index是从1开始的,这是关于文件数据索引规则的关键信息,与信息技术领域相关。
 obj中f的vertices的index是从1开始的!
【语音分离】基于平均谐波结构建模的无监督单声道音乐声源分离(Matlab代码实现)内容概要:本文介绍了基于平均谐波结构建模的无监督单声道音乐声源分离方法,并提供了相应的Matlab代码实现。该方法通过对音乐信号中的谐波结构进行建模,利用音源间的频率特征差异,实现对混合音频中不同乐器或人声成分的有效分离。整个过程无需标注数据,属于无监督学习范畴,适用于单通道录音场景下的语音与音乐分离任务。文中强调了算法的可复现性,并附带完整的仿真资源链接,便于读者学习与验证。; 适合人群:具备一定信号处理基础和Matlab编程能力的高校学生、科研人员及从事音频处理、语音识别等相关领域的工程师;尤其适合希望深入理解声源分离原理并进行算法仿真实践的研究者。; 使用场景及目标:①用于音乐音频中人声与伴奏的分离,或不同乐器之间的分离;②支持无监督条件下的语音处理研究,推动盲源分离技术的发展;③作为学术论文复现、课程项目开发或科研原型验证的技术参考。; 阅读建议:建议读者结合提供的Matlab代码与网盘资料同步运行调试,重点关注谐波建模与频谱分解的实现细节,同时可扩展学习盲源分离中的其他方法如独立成分分析(ICA)或非负矩阵分解(NMF),以加深对音频信号分离机制的理解。
内容概要:本文系统介绍了新能源汽车领域智能底盘技术的发展背景、演进历程、核心技术架构及创新形态。文章指出智能底盘作为智能汽车的核心执行层,通过线控化(X-By-Wire)和域控化实现驱动、制动、转向、悬架的精准主动控制,支撑高阶智能驾驶落地。技术发展历经机械、机电混合到智能三个阶段,当前以线控转向、线控制动、域控制器等为核心,并辅以传感器、车规级芯片、功能安全等配套技术。文中还重点探讨了“智能滑板底盘”这一创新形态,强调其高度集成化、模块化优势及其在成本、灵活性、空间利用等方面的潜力。最后通过“2025智能底盘先锋计划”的实车测试案例,展示了智能底盘在真实场景中的安全与性能表现,推动技术从研发走向市场验证。; 适合人群:汽车电子工程师、智能汽车研发人员、新能源汽车领域技术人员及对智能底盘技术感兴趣的从业者;具备一定汽车工程或控制系统基础知识的专业人士。; 使用场景及目标:①深入了解智能底盘的技术演进路径与系统架构;②掌握线控技术、域控制器、滑板底盘等关键技术原理与应用场景;③为智能汽车底盘研发、系统集成与技术创新提供理论支持与实践参考。; 阅读建议:建议结合实际车型和技术标准进行延伸学习,关注政策导向与行业测试动态,注重理论与实车验证相结合,全面理解智能底盘从技术构想到商业化落地的全过程。
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全性与鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真与复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现与算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码与案例进行实践操作,重点关注双层优化结构与场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
classdef TouchComper < handle % 触摸判断状态机类 % 触摸判断状态机类 properties % 状态机核心属性 Current_TouchSt previous_TouchSt current_value previous_value PeakValue AmplitudeConfirmationFlag IdleJumpFlag TimeCount TSD_ShakeCnt FORCE_QUIT Fifo_Sum % 隐藏极性相关 hiddenPolarityStartFlagBit hidePolarityDuration hiddenPolarity % 新增:多频点置信度相关 timeSlicePlan; % 时间片方案 0 -- 未使用,1 -- 使用 vibrationFifoScheme; % 震荡FIFO方案 0 -- 未使用,1 -- 使用 thePositiveAndNegativeOfFifo; % FIFO的正负 0 -- 负,1 -- 正 % FIFO 缓冲区 OSDCHx_Fifo end properties (Constant) % === 状态常量定义 === TOUCH_IDLE = 0; FIRST_POLARITY = 1; WAITING_STATE = 2; TOUCH_TO_CONFIRM = 3; COOLING_STATE = 4; % 干扰等级 INTERFERENCE_LEVEL = 3; % 基础比较器相关参数 MAXIMUM_VALUE_OF_BURRS = 2; % 毛刺的最大值 TOUCH_THRESHOLD = 5; % 触摸阈值 TIME_SLICE_CONFIRMATION_TIMES = 5; % 时间片确认次数 THE_SIZE_OF_THE_OSCILLATING_FIFO = 16; % 震荡FIFO的大小 THE_THRESHOLD_FOR_THE_OSCILLATING_FIFO = 14; % 震荡FIFO的阈值 % 空闲状态的比较器参数 IDLE_TIME_SLOT_CONFIRMATION_COUNT = 3; % 空闲时间片确认次数 IDLE_FIFO_WINDOW_TIME = 6; % 空闲FIFO滑窗时间 IDLE_FIFO_THRESHOLD = 9; % 空闲FIFO阈值 % 触摸状态的比较器参数 MAXIMUM_VALUE_CONFIRMATION_TIME = 3; % 最大值确认时间 LONGEST_INITIAL_DETECTION_TIME = 48; % 最长初次检测时间 LONGEST_MATCH_WAITING_TIME = 80; % 最长匹配等待时间 % 触摸确认后的冷却参数 COOLING_TIME_AFTER_TOUCH = 25; % 触摸后冷却时间 CONFIRM_THE_TIME_SLICE_THRESHOLD = 3; % 确认时间片阈值 MINIMUM_STABLE_FREQUENCY = 10; % 最低的稳定次数 COOLING_FIFO_SIZE = 10; % 冷却FIFO大小 COOLING_FIFO_THRESHOLD = 1; % 冷却FIFO阈值 end methods %% ========================= 构造函数 ========================= function obj = TouchComper() % 构造函数 - 初始化所有状态变量 obj.Current_TouchSt = TouchComper.TOUCH_IDLE; obj.previous_TouchSt = TouchComper.TOUCH_IDLE; obj.current_value = 0; obj.previous_value = 0; obj.PeakValue = 0; obj.AmplitudeConfirmationFlag = 0; obj.IdleJumpFlag = false; obj.TimeCount = 0; obj.TSD_ShakeCnt = 0; obj.hiddenPolarityStartFlagBit = false; obj.hidePolarityDuration = 0; obj.hiddenPolarity = 0; obj.FORCE_QUIT= 0; obj.Fifo_Sum= 0; % 初始化FIFO obj.OSDCHx_Fifo = Touch_FIFO(TouchComper.THE_SIZE_OF_THE_OSCILLATING_FIFO); % 缓冲区大小 end %% ========================= 主处理函数 ========================= function New_TouchTheComparatorFunction(obj, current_value) obj.current_value = current_value; % 隐藏极性超时处理 if obj.hiddenPolarityStartFlagBit obj.hidePolarityDuration = obj.hidePolarityDuration + 1; if obj.hidePolarityDuration >= 300 obj.hiddenPolarityStartFlagBit = false; obj.hiddenPolarity = 0; obj.hidePolarityDuration = 0; end end % 状态机调度 switch obj.Current_TouchSt case TouchComper.TOUCH_IDLE TOUCH_IDLE_PROCESS(obj); case TouchComper.FIRST_POLARITY FIRST_POLARITY_PROCESS(obj); case TouchComper.WAITING_STATE WAITING_STATE_PROCESS(obj); case TouchComper.TOUCH_TO_CONFIRM TOUCH_TO_CONFIRM_PROCESS(obj); case TouchComper.COOLING_STATE COOLING_STATE_PROCESS(obj); end obj.previous_value = obj.current_value; end %% ========================= 限时判断函数 ========================= function result = TimeLimitedJudgment(obj) % 限时判断函数 obj.TimeCount = obj.TimeCount + 1; switch obj.Current_TouchSt case obj.TOUCH_IDLE result = false; case obj.FIRST_POLARITY switch obj.INTERFERENCE_LEVEL case 0 result = obj.TimeCount > 0; case 1 result = obj.TimeCount > 2; case 2 result = obj.TimeCount <= obj.LONGEST_INITIAL_DETECTION_TIME; case 3 result = obj.TimeCount <= obj.LONGEST_INITIAL_DETECTION_TIME; end case obj.WAITING_STATE switch obj.INTERFERENCE_LEVEL case 0 result = obj.TimeCount > 0; case 1 result = obj.TimeCount > 2; case 2 result = obj.TimeCount <= obj.LONGEST_MATCH_WAITING_TIME; case 3 result = obj.TimeCount <= obj.LONGEST_INITIAL_DETECTION_TIME; end case obj.TOUCH_TO_CONFIRM switch obj.INTERFERENCE_LEVEL case 0 result = obj.TimeCount > 0; case 1 result = obj.TimeCount > 2; case 2 result = obj.TimeCount > obj.COOLING_TIME_AFTER_TOUCH; case 3 result = obj.TimeCount > obj.COOLING_TIME_AFTER_TOUCH; end otherwise result = false; end end %% ========================= 重置触摸检测状态 ========================= function resetTouchDetection(obj) % 重置触摸检测相关状态 % 清零FIFO缓冲区 Touch_FIFO_Zero(obj.OSDCHx_Fifo); % 重置计数器 obj.TSD_ShakeCnt = 0; obj.TimeCount = 0; obj.AmplitudeConfirmationFlag = 0; % 清零峰值 obj.PeakValue = 0; end %% ========================= 时间片方案 ========================= function result = TimeSliceScheme(obj) % 时间片方案实现 abs_current = abs(obj.current_value); result = false; switch obj.Current_TouchSt case obj.TOUCH_IDLE if abs_current >= obj.TOUCH_THRESHOLD obj.TSD_ShakeCnt = obj.TSD_ShakeCnt + 1; else obj.TSD_ShakeCnt = 0; end switch obj.INTERFERENCE_LEVEL case 0 result = obj.TSD_ShakeCnt > 0; case 1 result = obj.TSD_ShakeCnt > 2; case 2 result = obj.TSD_ShakeCnt >= obj.IDLE_TIME_SLOT_CONFIRMATION_COUNT; case 3 result = obj.TSD_ShakeCnt >= obj.IDLE_TIME_SLOT_CONFIRMATION_COUNT; end case {obj.FIRST_POLARITY, obj.WAITING_STATE} if abs_current >= obj.TOUCH_THRESHOLD obj.TSD_ShakeCnt = obj.TSD_ShakeCnt + 1; else obj.TSD_ShakeCnt = 0; end switch obj.INTERFERENCE_LEVEL case 0 result = obj.TSD_ShakeCnt > 0; case 1 result = obj.TSD_ShakeCnt > 2; case 2 result = obj.TSD_ShakeCnt >= obj.TIME_SLICE_CONFIRMATION_TIMES; case 3 result = obj.TSD_ShakeCnt >= obj.TIME_SLICE_CONFIRMATION_TIMES; end case obj.TOUCH_TO_CONFIRM if abs_current <= obj.CONFIRM_THE_TIME_SLICE_THRESHOLD obj.TSD_ShakeCnt = obj.TSD_ShakeCnt + 1; else obj.TSD_ShakeCnt = 0; end switch obj.INTERFERENCE_LEVEL case 0 result = obj.TSD_ShakeCnt > 0; case 1 result = obj.TSD_ShakeCnt > 2; case 2 result = obj.TSD_ShakeCnt > obj.MINIMUM_STABLE_FREQUENCY; case 3 result = obj.TSD_ShakeCnt > obj.MINIMUM_STABLE_FREQUENCY; end otherwise result = false; end end %% ========================= 震荡FIFO方案 ========================= function sum_val = ShockFifoScheme(obj, window_length) % 震荡FIFO方案实现 abs_current = abs(obj.current_value); sum_val = 0; % 确保窗口长度不超过FIFO大小 if window_length > obj.THE_SIZE_OF_THE_OSCILLATING_FIFO window_length = obj.THE_SIZE_OF_THE_OSCILLATING_FIFO; end % 第一次极性或空闲状态处理 if ismember(obj.Current_TouchSt, [obj.FIRST_POLARITY, obj.TOUCH_IDLE]) if abs_current >= obj.TOUCH_THRESHOLD if obj.OSDCHx_Fifo.Fifo_Start == 0 obj.OSDCHx_Fifo.Fifo_Start = true; obj.OSDCHx_Fifo.Fifo_Start = true; end % 写入符号值 if obj.current_value > 0 Touch_FIFO_Write(obj.OSDCHx_Fifo, 2 , window_length ); else Touch_FIFO_Write(obj.OSDCHx_Fifo, -2 , window_length ); end elseif abs_current > obj.MAXIMUM_VALUE_OF_BURRS if obj.OSDCHx_Fifo.Fifo_Start == 1 if obj.current_value > 0 Touch_FIFO_Write(obj.OSDCHx_Fifo, 1 , window_length ); else Touch_FIFO_Write(obj.OSDCHx_Fifo, -1 , window_length ); end end else if obj.OSDCHx_Fifo.Fifo_Start Touch_FIFO_Write(obj.OSDCHx_Fifo, 0 , window_length ); end end % 等待状态处理 elseif obj.Current_TouchSt == obj.WAITING_STATE abs_peak = abs(obj.PeakValue); half_peak = bitshift(abs_peak, -2); % abs_peak / 4 max_trigger = abs_peak + bitshift(abs_peak, -1); % 1.5 * abs_peak % 方向判断 data_dir = (abs_current > half_peak) && (abs_current < max_trigger); if obj.current_value == 0 n_dir = 14; else n_dir = sign(obj.current_value); end dir_val = 0; if n_dir == obj.hiddenPolarity dir_val = -1; % 同向 elseif n_dir + obj.hiddenPolarity == 0 dir_val = 1; % 反向 end % 判断开始条件 if (dir_val == 1) && data_dir && (abs_current >= obj.TOUCH_THRESHOLD) if ~obj.OSDCHx_Fifo.Fifo_Start obj.OSDCHx_Fifo.Fifo_Start = true; obj.OSDCHx_Fifo.Fifo_First = true; end end % 更新FIFO if data_dir && (abs_current >= obj.TOUCH_THRESHOLD) if obj.OSDCHx_Fifo.Fifo_Start if obj.current_value > 0 Touch_FIFO_Write(obj.OSDCHx_Fifo, 2 , window_length ); else Touch_FIFO_Write(obj.OSDCHx_Fifo, -2 , window_length ); end end elseif ~data_dir && (abs_current > obj.TOUCH_THRESHOLD) if obj.OSDCHx_Fifo.Fifo_Start if obj.current_value > 0 Touch_FIFO_Write(obj.OSDCHx_Fifo, 2 , window_length ); else Touch_FIFO_Write(obj.OSDCHx_Fifo, -2 , window_length ); end end elseif data_dir && (abs_current > obj.MAXIMUM_VALUE_OF_BURRS) if obj.OSDCHx_Fifo.Fifo_Start if obj.current_value > 0 Touch_FIFO_Write(obj.OSDCHx_Fifo, 1 , window_length ); else Touch_FIFO_Write(obj.OSDCHx_Fifo, -1 , window_length ); end end else if obj.OSDCHx_Fifo.Fifo_Start Touch_FIFO_Write(obj.OSDCHx_Fifo, 0 , window_length ); end end end % 检查FIFO是否激活 if obj.OSDCHx_Fifo.Fifo_Start == 0 % 重置FIFO缓冲区 Touch_FIFO_Zero(obj.OSDCHx_Fifo); sum_val = 0; return; end % 计算FIFO窗口和 sum_val = Touch_FIFO_GetSum(obj.OSDCHx_Fifo); end %% ========================= FIFO清零函数 ========================= function IdleFiltering(obj) % 空闲状态过滤逻辑实现 % 1. 获取时间片方案和震荡FIFO方案结果 timeSliceResult = obj.TimeSliceScheme(); obj.Fifo_Sum = obj.ShockFifoScheme(obj.IDLE_FIFO_WINDOW_TIME); % 2. 根据干扰等级保存FIFO求和值 % if obj.INTERFERENCE_LEVEL == 3 % if obj.FreqPointFlag == 0 % obj.FreqPoint1_Fifo_sum = fifoSum; % else % obj.FreqPoint2_Fifo_sum = fifoSum; % end % else % obj.Fifo_sum = fifoSum; % end % 3. 检查震荡结果阈值 shock_result = (abs(obj.Fifo_Sum) >= obj.IDLE_FIFO_THRESHOLD); % 4. 更新峰值检测逻辑 if obj.OSDCHx_Fifo.Fifo_Start % 更新峰值 if abs(obj.current_value) >= abs(obj.PeakValue) obj.PeakValue = obj.current_value; obj.AmplitudeConfirmationFlag = 0; else obj.AmplitudeConfirmationFlag = obj.AmplitudeConfirmationFlag + 1; end else obj.PeakValue = 0; obj.AmplitudeConfirmationFlag = 0; end % 5. 状态转换决策 if timeSliceResult || shock_result % 记录时间计数 if timeSliceResult % 时间片方案成立 obj.TimeCount = obj.TSD_ShakeCnt; obj.timeSlicePlan = 1; obj.vibrationFifoScheme = 0; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); elseif shock_result % 震荡FIFO方案成立 obj.TimeCount = obj.IDLE_FIFO_WINDOW_TIME + obj.OSDCHx_Fifo.pFIFO_current; obj.timeSlicePlan = 0; obj.vibrationFifoScheme = 1; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); end % 6. FIFO缓冲区管理 if obj.OSDCHx_Fifo.pFIFO_current < obj.OSDCHx_Fifo.pFifoTo2 % 向前复制数据 for i = 1:obj.OSDCHx_Fifo.pFIFO_current obj.OSDCHx_Fifo.OSD_Fifo(obj.IDLE_FIFO_WINDOW_TIME + i) = ... obj.OSDCHx_Fifo.OSD_Fifo(i); end obj.OSDCHx_Fifo.Fifo_First = true; obj.OSDCHx_Fifo.pFIFO_current = obj.IDLE_FIFO_WINDOW_TIME + ... obj.OSDCHx_Fifo.pFIFO_current; elseif obj.OSDCHx_Fifo.pFIFO_current == obj.OSDCHx_Fifo.pFifoTo2 obj.OSDCHx_Fifo.Fifo_First = true; obj.OSDCHx_Fifo.pFIFO_current = obj.OSDCHx_Fifo.pFIFO_current + ... (obj.IDLE_FIFO_WINDOW_TIME - 1); else obj.OSDCHx_Fifo.Fifo_First = true; end % 7. 状态转换 obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.FIRST_POLARITY; end end % 空闲处理函数 function TOUCH_IDLE_PROCESS(obj) if abs(obj.current_value) > obj.MAXIMUM_VALUE_OF_BURRS obj.IdleFiltering(); else Touch_FIFO_Zero(obj.OSDCHx_Fifo); obj.TSD_ShakeCnt = 0; obj.TimeCount = 0; obj.AmplitudeConfirmationFlag = 0; obj.PeakValue = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; end end %% ========================= 第一次极性确认状态处理 ========================= function FIRST_POLARITY_PROCESS(obj) % 第一次极性确认状态处理函数 % 1. 获取时间标志位和时间片方案结果 timeResult = obj.TimeLimitedJudgment(); timeSliceResult = obj.TimeSliceScheme(); % 2. 获取震荡FIFO方案结果 obj.Fifo_Sum = obj.ShockFifoScheme(obj.THE_SIZE_OF_THE_OSCILLATING_FIFO); % % 3. 根据干扰等级保存结果 % if obj.INTERFERENCE_LEVEL == 3 % if obj.FreqPointFlag == 0 % obj.FreqPoint1_Fifo_sum = fifoSum; % else % obj.FreqPoint2_Fifo_sum = fifoSum; % end % else % obj.Fifo_sum = fifoSum; % end % 4. 判断震荡FIFO方案结果是否超过阈值 shock_result = (abs(obj.Fifo_Sum) >= obj.THE_THRESHOLD_FOR_THE_OSCILLATING_FIFO); % 5. 检测成功标志并锁定 if ~obj.IdleJumpFlag obj.IdleJumpFlag = timeSliceResult || shock_result; if timeSliceResult obj.timeSlicePlan = 1; obj.vibrationFifoScheme = 0; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); elseif shock_result obj.timeSlicePlan = 0; obj.vibrationFifoScheme = 1; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); end end % 6. 超时退出处理 if ~timeResult obj.resetTouchDetection(); obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; return; end % 7. FIFO停止后返回空闲状态 if ~obj.OSDCHx_Fifo.Fifo_Start obj.resetTouchDetection(); obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; return; end % 8. 更新峰值检测 if abs(obj.current_value) >= abs(obj.PeakValue) obj.PeakValue = obj.current_value; obj.AmplitudeConfirmationFlag = 0; else obj.AmplitudeConfirmationFlag = obj.AmplitudeConfirmationFlag + 1; end % 9. 极性确认逻辑 if obj.IdleJumpFlag && (obj.AmplitudeConfirmationFlag >= obj.MAXIMUM_VALUE_CONFIRMATION_TIME) n_dir = sign(obj.PeakValue); % 获取峰值方向 if ~obj.hiddenPolarityStartFlagBit % 不存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarity = n_dir; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.WAITING_STATE; else % 存在隐藏极性 if n_dir + obj.hiddenPolarity == 0 % 反向 obj.resetTouchDetection(); obj.hiddenPolarity = n_dir; obj.IdleJumpFlag = false; obj.hiddenPolarityStartFlagBit = true; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.WAITING_STATE; else % 同向 obj.resetTouchDetection(); obj.IdleJumpFlag = false; obj.hiddenPolarity = n_dir; obj.hiddenPolarityStartFlagBit = false; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.WAITING_STATE; end end end end %% ========================= 等待状态处理函数 ========================= function WAITING_STATE_PROCESS(obj) % 等待状态处理函数 % 1. 获取时间标志位 timeResult = obj.TimeLimitedJudgment(); % 2. 超时退出处理 if ~timeResult if ~obj.hiddenPolarityStartFlagBit % 不存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarityStartFlagBit = true; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; else % 存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarity = 0; obj.IdleJumpFlag = false; obj.hiddenPolarityStartFlagBit = false; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_TO_CONFIRM; end return; end % 3. FIFO状态处理 if obj.OSDCHx_Fifo.Fifo_Start % 获取时间片方案结果 timeSliceResult = obj.TimeSliceScheme(); obj.AmplitudeConfirmationFlag = 1; else obj.TSD_ShakeCnt = 0; end % 4. FIFO停止处理 if obj.AmplitudeConfirmationFlag == 1 && ~obj.OSDCHx_Fifo.Fifo_Start if ~obj.hiddenPolarityStartFlagBit % 不存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarityStartFlagBit = true; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; else % 存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarity = 0; obj.IdleJumpFlag = false; obj.hiddenPolarityStartFlagBit = false; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_TO_CONFIRM; end return; end % 5. 稳定状态检测 if abs(obj.current_value) <= obj.MAXIMUM_VALUE_OF_BURRS obj.IdleJumpFlag = obj.IdleJumpFlag + 1; if obj.IdleJumpFlag >= obj.MINIMUM_STABLE_FREQUENCY if ~obj.hiddenPolarityStartFlagBit % 不存在隐藏极性 obj.resetTouchDetection(); obj.AmplitudeConfirmationFlag = 1; obj.hiddenPolarityStartFlagBit = true; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_IDLE; else % 存在隐藏极性 obj.resetTouchDetection(); obj.hiddenPolarity = 0; obj.IdleJumpFlag = false; obj.hiddenPolarityStartFlagBit = false; obj.hidePolarityDuration = 0; obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_TO_CONFIRM; end return; end else obj.IdleJumpFlag = 0; % 重置稳定计数器 end % 6. 获取震荡FIFO方案结果 obj.Fifo_Sum = obj.ShockFifoScheme(obj.THE_SIZE_OF_THE_OSCILLATING_FIFO); % % 7. 根据干扰等级保存结果 % if obj.INTERFERENCE_LEVEL == 3 % if obj.FreqPointFlag == 0 % obj.FreqPoint1_Fifo_sum = fifoSum; % else % obj.FreqPoint2_Fifo_sum = fifoSum; % end % else % obj.Fifo_sum = fifoSum; % end % 8. 检测方案结果处理 if timeSliceResult || (abs(obj.Fifo_Sum) >= obj.THE_THRESHOLD_FOR_THE_OSCILLATING_FIFO) % 记录触发源 if timeSliceResult obj.timeSlicePlan = 1; obj.vibrationFifoScheme = 0; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); else obj.timeSlicePlan = 0; obj.vibrationFifoScheme = 1; obj.thePositiveAndNegativeOfFifo = (obj.Fifo_Sum > 0); end % 重置触摸检测状态 obj.resetTouchDetection(); obj.hiddenPolarity = 0; obj.IdleJumpFlag = false; % 状态转换 obj.previous_TouchSt = obj.Current_TouchSt; obj.Current_TouchSt = obj.TOUCH_TO_CONFIRM; return; end end %% ========================= 冷却状态处理函数 ========================= function COOLING_STATE_PROCESS(obj) time_result = obj.TimeLimitedJudgment(); result = obj.TimeSliceScheme(); % 如果时间片方案成立,立刻返回到空闲状态 if result obj.OSDCHx_Fifo = Touch_FIFO_Zero(obj.OSDCHx_Fifo); obj.TSD_ShakeCnt = 0 ; obj.TimeCount = 0 ; obj.AmplitudeConfirmationFlag = 0 ; obj.PeakValue = 0 ; obj.hiddenPolarity = 0 ; obj.IdleJumpFlag = 0 ; obj.previous_TouchSt = obj.Current_TouchSt ; obj.previous_TouchSt = obj.TOUCH_IDLE ; obj.FORCE_QUIT = 1; return; end if time_result obj.PeakValue = obj.PeakValue + 1; obj.TimeCount = 0; if obj.TSD_ShakeCnt >= int16(obj.MINIMUM_STABLE_FREQUENCY / 2) obj.OSDCHx_Fifo = Touch_FIFO_Zero(obj.OSDCHx_Fifo); obj.TSD_ShakeCnt = 0 ; obj.TimeCount = 0 ; obj.AmplitudeConfirmationFlag = 0 ; obj.PeakValue = 0 ; obj.hiddenPolarity = 0 ; obj.IdleJumpFlag = 0 ; obj.previous_TouchSt = obj.Current_TouchSt ; obj.previous_TouchSt = obj.TOUCH_IDLE ; obj.FORCE_QUIT = 1; return ; end end if obj.PeakValue > 2 obj.OSDCHx_Fifo = Touch_FIFO_Zero(obj.OSDCHx_Fifo); obj.TSD_ShakeCnt = 0 ; obj.TimeCount = 0 ; obj.AmplitudeConfirmationFlag = 0 ; obj.PeakValue = 0 ; obj.hiddenPolarity = 0 ; obj.IdleJumpFlag = 0 ; obj.previous_TouchSt = obj.Current_TouchSt ; obj.previous_TouchSt = obj.TOUCH_IDLE ; obj.FORCE_QUIT = 1; end end %% ========================= 检测成功处理函数 ========================= function TOUCH_TO_CONFIRM_PROCESS(obj) Touch_FIFO_Zero(obj.OSDCHx_Fifo); obj.TSD_ShakeCnt = 0 ; obj.TimeCount = 0 ; obj.AmplitudeConfirmationFlag = 0 ; obj.PeakValue = 0 ; obj.hiddenPolarity = 0 ; obj.IdleJumpFlag = 0 ; obj.previous_TouchSt = obj.Current_TouchSt ; obj.previous_TouchSt = obj.COOLING_STATE ; end end end classdef Touch_FIFO < handle properties Fifo_Start = 1 Fifo_First = 1 OSD_Fifo pFIFO_current=1 pFifoTo2 % 开设的最大的fifo max_fifowid % 当前使用的最大fifo used_fifowid = 0 end methods % 构造函数 function obj = Touch_FIFO(THE_SIZE_OF_THE_OSCILLATING_FIFO) obj.max_fifowid = THE_SIZE_OF_THE_OSCILLATING_FIFO; obj.Touch_FIFO_Zero(); end % 清零函数 function Touch_FIFO_Zero(obj) % 确保使用后会将开辟出的环形缓冲区清零 if obj.Fifo_First == 0 obj.used_fifowid = 0; obj.max_fifowid = 0; obj.OSD_Fifo = zeros(1,obj.used_fifowid,"int8"); else obj.OSD_Fifo = zeros(1,obj.max_fifowid,"int8"); end obj.Fifo_Start = 0; obj.Fifo_First = 1; obj.pFIFO_current = 1; % matlab的数组索引是从1开始,C语言是从零开始的 obj.pFifoTo2 = 1; % matlab的数组索引是从1开始,C语言是从零开始的 end % 写入函数 function Touch_FIFO_Write(obj , vaule , writeThePointerWindingLength) if obj.used_fifowid > obj.max_fifowid error('当前使用的FIFO大小超过了设定的最大FIFO,当前设定最大值:%d' , obj.max_fifowid); end obj.used_fifowid = writeThePointerWindingLength; if obj.used_fifowid > obj.max_fifowid error('当前使用的FIFO大小超过了设定的最大FIFO,当前设定最大值:%d' , obj.max_fifowid); end if obj.Fifo_Start == 1 % 仅在FIFO第一次启用时进行处理 obj.OSD_Fifo(obj.pFIFO_current) = vaule ; obj.pFIFO_current = obj.pFIFO_current + 1; % 处理写指针回绕 if obj.pFIFO_current > writeThePointerWindingLength obj.pFIFO_current = 1; obj.Fifo_First = 0; end end % 缓冲区满检测 if ((obj.pFIFO_current > obj.pFifoTo2) && (obj.Fifo_First == 0)) for i = obj.pFifoTo2 : writeThePointerWindingLength if abs(obj.OSD_Fifo(i)) == 2 obj.pFifoTo2 = i; return; end end for i = 1 : writeThePointerWindingLength if abs(obj.OSD_Fifo(i)) == 2 obj.pFifoTo2 = i; return; end end obj.Touch_FIFO_Zero(); end end % 求和函数 function sum = Touch_FIFO_GetSum(obj) if obj.pFIFO_current > obj.pFifoTo2 sum = 0; for i = obj.pFifoTo2 : obj.pFIFO_current-1 sum = sum + obj.OSD_Fifo(i); end else sum = 0; for i = obj.pFifoTo2 : writeThePointerWindingLength sum = sum + obj.OSD_Fifo(i); end for i = 1 : obj.pFIFO_current-1 sum = sum + obj.OSD_Fifo(i); end end end end end 检查代码存在的问题,但是不要修改代码逻辑以及代码本身的变量定义
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值