波形识别,方波、三角波和正弦波的区分(不使用FFT)

四天三夜电赛结束,期间想出了一个简单但很有实用性的算法。上网搜索似乎还没有人在相关话题下提出这种算法,在此记录一下。

常见的波形识别算法一般是对信号进行频谱分析来实现,通过判断谱线数量和谱线高度就能得出结果。但如果只是需要识别一些简单的信号,比如正弦波、方波、三角波,其实还有更简单的算法,只需要测量信号峰值并做计数操作就可以实现对这些波形的区分。

我们之所以能用肉眼识别这些波形,是因为他们的形状都各有特点。因此,只需要利用好其形状特点,就可以很好地实现波形类型的区分。

正弦波
三角波
方波

具体如何实现的呢?方法就是计数,当信号大于阈值,计数值加一。如果是以零点为阈值,我们会发现正弦波、三角波和方波的计数值相等,这当然无法用于区分波形。但如果阈值不是零点呢?

尝试将阈值设置为信号峰值的二分之一,再次计数,并将最终的计数值除以信号总采样点数,得到大于阈值的点所占比例。结果是,正弦波是33%,三角波是25%,方波是50%。此时三种波形在这个特征上表现出了明显的差异,用于区分已经足够了!

如果我们试着再把阈值调高,可以发现结果的差异更加明显。

阈值正弦波三角波方波
1/20.3333 0.25000.5000
3/40.23010.12500.5000
7/80.16090.06250.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);

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值