如何实现削波全波整流正弦波的信号周期计数器?
削波全波整流正弦波的周期计数DAX实现
需求说明
每隔几秒读取削波全波整流正弦波的信号值,需编写DAX度量值,每完成一个周期自动将计数器加1。示例数据对应的信号周期数为3,此前尝试的DAX因采样频率高导致重复数据,无法正确计数:
Counter = CALCULATE (COUNTROWS (tableName), FILTER (tableName, tableName[Value]>500))
示例数据
| DeviceID | TesterID | Value | DateTime |
|---|---|---|---|
| 1 | 22 | 0 | 01.10.2022 00:00:00 |
| 1 | 22 | 500 | 01.10.2022 00:01:00 |
| 1 | 22 | 500 | 01.10.2022 00:01:15 |
| 1 | 22 | 1000 | 01.10.2022 00:02:00 |
| 1 | 22 | 1000 | 01.10.2022 00:02:15 |
| 1 | 22 | 1000 | 01.10.2022 00:02:30 |
| 1 | 22 | 500 | 01.10.2022 00:02:40 |
| 1 | 22 | 500 | 01.10.2022 00:02:42 |
| 1 | 22 | 0 | 01.10.2022 00:02:45 |
解决方案:基于斜率检测的周期计数
核心思路是检测信号的上升沿触发点(从≤500跳变到>500)或完整周期结束点(从>500跳变回0),避免重复计数同一周期内的采样数据。以下提供两种实现方式:
方式一:检测完整周期的结束节点(回到0的时刻)
通过标记每个采样点的前一个值,筛选出从500(或更高)跳变到0的节点,这些节点即为周期结束标志:
- 添加计算列,获取每个采样点的前一个值(按
DeviceID、TesterID和DateTime排序):
Previous Value = VAR CurrentDateTime = tableName[DateTime] VAR CurrentDevice = tableName[DeviceID] VAR CurrentTester = tableName[TesterID] RETURN CALCULATE( MAX(tableName[Value]), FILTER( tableName, tableName[DeviceID] = CurrentDevice && tableName[TesterID] = CurrentTester && tableName[DateTime] < CurrentDateTime ) )
- 编写度量值统计周期结束节点的数量:
Cycle Counter = CALCULATE( COUNTROWS(tableName), FILTER( tableName, tableName[Value] = 0 && tableName[Previous Value] = 500 ) )
方式二:检测上升沿触发点(从≤500到>500)
对于削波全波整流信号,每个周期会有一次明确的上升沿(从低电平到过500阈值),通过检测该跳变点来计数:
Cycle Counter = VAR RankedData = ADDCOLUMNS( tableName, "RowRank", RANKX( FILTER(tableName, tableName[DeviceID] = EARLIER(tableName[DeviceID]) && tableName[TesterID] = EARLIER(tableName[TesterID])), tableName[DateTime],,ASC,Dense ) ) VAR TransitionPoints = FILTER( RankedData, [Value] > 500 && LOOKUPVALUE( tableName[Value], tableName[DeviceID], [DeviceID], tableName[TesterID], [TesterID], "RowRank", [RowRank]-1 ) <= 500 ) RETURN COUNTROWS(TransitionPoints)
注意事项
- 确保
DateTime列是正确的日期时间格式,且无重复时间戳(若有重复需额外处理排序逻辑)。 - 若信号存在噪声,可添加阈值容错(比如判断前一个值≤550且当前值≥450),避免误触发计数。
内容的提问来源于stack exchange,提问作者shakingwindow
相关产品推荐
相关产品推荐

