波形识别新方法:不使用FFT区分正弦波、三角波和方波
创作时间:
作者:
@小白创作中心
波形识别新方法:不使用FFT区分正弦波、三角波和方波
引用
CSDN
1.
https://blog.csdn.net/qq_53701123/article/details/132132828
本文介绍了一种不使用FFT的波形识别算法,通过设置不同阈值来计数信号峰值,从而区分正弦波、三角波和方波。该方法简单实用,仅需测量信号峰值并做计数操作即可实现波形区分。文章还提供了详细的MATLAB仿真代码,便于读者复现和学习。
常见的波形识别算法一般是对信号进行频谱分析来实现,通过判断谱线数量和谱线高度就能得出结果。但如果只是需要识别一些简单的信号,比如正弦波、方波、三角波,其实还有更简单的算法,只需要测量信号峰值并做计数操作就可以实现对这些波形的区分。
我们之所以能用肉眼识别这些波形,是因为他们的形状都各有特点。因此,只需要利用好其形状特点,就可以很好地实现波形类型的区分。
具体如何实现的呢?方法就是计数,当信号大于阈值,计数值加一。如果是以零点为阈值,我们会发现正弦波、三角波和方波的计数值相等,这当然无法用于区分波形。但如果阈值不是零点呢?
尝试将阈值设置为信号峰值的二分之一,再次计数,并将最终的计数值除以信号总采样点数,得到大于阈值的点所占比例。结果是,正弦波是33%,三角波是25%,方波是50%。此时三种波形在这个特征上表现出了明显的差异,用于区分已经足够了!
如果我们试着再把阈值调高,可以发现结果的差异更加明显。
阈值 | 正弦波 | 三角波 | 方波 |
---|---|---|---|
1/2 | 0.3333 | 0.2500 | 0.5000 |
3/4 | 0.2301 | 0.1250 | 0.5000 |
7/8 | 0.1609 | 0.0625 | 0.5000 |
MATLAB仿真代码如下:
clear;close all;clc;
fs = 8e6; % 采样率8MHz
threshold = 1 - 1/8; % 阈值设置
t = 0: 1/fs : 0.1;
cnt_time = 0.1; % 计数时间
% 生成波形
sine_max = 2; % sine的峰值 正弦波
sine_freq = 100; % sine的频率
tri_max = 2; % tri的峰值 三角波
tri_freq = 100; % tri的频率
square_max = 2; % square的峰值 方波
square_freq = 100; % square的频率
sine_wave = sine_max * sin(2*pi*sine_freq*t);
tri_wave = tri_max * sawtooth(2*pi*square_freq*t, 0.5);
square_wave = square_max * square(2*pi*square_freq*t);
threshold_line = threshold * t./t;
subplot(311);
% plot(t, sine_wave, 'LineWidth', 1);
plot(t, sine_wave, t, threshold_line*sine_max, 'LineWidth', 1);
axis([-inf inf -2 2]);
subplot(312);
% plot(t, tri_wave, 'LineWidth', 1);
plot(t, tri_wave, t, threshold_line*tri_max, 'LineWidth', 1);
axis([-inf inf -2 2]);
subplot(313);
% plot(t, square_wave, 'LineWidth', 1);
plot(t, square_wave, t, threshold_line*square_max, 'LineWidth', 1);
axis([-inf inf -2 2]);
% 计数
sine_cnt = 0;
tri_cnt = 0;
square_cnt = 0;
cnt_total = cnt_time/(1/fs);
for i = 1:cnt_total
if(sine_wave(i) > threshold * sine_max)
sine_cnt = sine_cnt + 1;
end
if(tri_wave(i) > threshold * tri_max)
tri_cnt = tri_cnt + 1;
end
if(square_wave(i) > threshold * square_max)
square_cnt = square_cnt + 1;
end
end
% 打印结果
disp(sine_cnt/cnt_total);
disp(tri_cnt/cnt_total);
disp(square_cnt/cnt_total);
热门推荐
家庭种植梧桐树:从技巧到文化价值的全面指南
疲倦感:如何科学应对日常疲劳
中国航母战斗群与美国航母打击群,谁更强?
全日制日语学校多少钱:费用解析与选择指南
广电网络宽带:高速上网新选择,优缺点全解析
广电宽带信号质量全解析:优点与不足深度剖析
被开水烫伤后怎么处理
竖心旁字的文字演变,竖心旁的字是由什么变化而来的
刘邦约法三章的具体内容是什么
8 种适应弱光且可在室内轻松生长的植物
泥鳅与黄鳝哪个营养价值高
RAR解压缩软件的全面指南:压缩、加密、修复功能一应俱全
解压文件的软件推荐:高效处理压缩包的工具大盘点
吃剩的骨头怎么做肥料 利用剩骨打造绿色循环
产前诊断结果精度【医生监修】
产前诊断结果精度【医生监修】
深入解析:螺栓螺纹牙距的区别与计算方法
电话智能客服机器人怎么实现?
作家的职业性质是什么
绩效反馈中如何做到既指出问题,又给予改进建议?
汗疱疹能否在家自行用达克宁治疗?
多道好菜、服务出彩!普陀这家社区食堂“懂”人心
体育大学中外合作办学推荐
本地安装MySQL数据库详细步骤
个人债务危机找政府帮忙可以吗
“哪吒”继续海外圈粉 中国动画“出海”如踩“风火轮”
赛博朋克2077:快速击杀敌人技巧攻略
在Excel中如何添加目标值
私域运营如何提升用户粘性?
海上仙山的秘密:探索蓬莱与中国古代宗教的深层联系