问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

波形识别新方法:不使用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);
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号