数字信号处理公式变程序(三)——压缩算法

之前搞了一些数字信号处理算法编程(OC),一直没来得及整理,现在整理一下,包括FFT、巴特沃斯滤波器(高低带通、高低带阻)、数据差值(线性、sinc、三次样条*)、数据压缩(等距、平均、峰值检测)和模仿matlab的STFT功能(spectrogram函数三维绘图)。

 

注:可能会有不足或者理解偏差的地方,路过的高人请不吝赐教。

 

好啦,进入正题。

---------------------------------------------------------------------------------------

在数字信号处理中如果数据量太大往往需要从中按照一定原则抽取部分点进行分析,此过程叫做压缩。压缩有很多种,这里只实现其中3种:等距、平均和峰值检测。

一、等距压缩

1.原理及实现

等距压缩就是从一堆数据中,按照相等的步长抽取点。如数组{1,2,3,4,5,6,7,8,9,10},步长为2(每两个点取一个)压缩结果是:{1,3,5,7,9}。

 

2.运算结果测试

 

 

原数组为16个sin计算值,每两个点取一个,压缩后数组导入matlab绘图如下:

说明:蓝色线为原数组连线,红色线为压缩后数据的连线。

 

 

 

二、平均压缩

1.原理及实现

平均压缩是一个过程算法,即为动态压缩。举例如下:求平均次数为N的压缩结果,每次数据分别为s1, s2, s3, ..., sn。

第1次平均:s = s1/1;

第2次平均:s = (s*1+s2)/2;

...

第i次平均:s = (s*(i-1)+si)/i;

...

第n次平均:s = (s*(n-1)+sn)/n;

 

由于平均压缩为动态过程,所以实现方法有两种:

①多次调用,每次传入当前平均次数和当前信号的数组(本文采用的方法);

②单次调用,一次性传入多个数组(或一个二维数组),自动循环计算。


2.测试结果

 

将16个sin计算值和0.95倍的该值打包成两个数组,2次平均压缩后的数据导入matlab绘图如下:蓝色为第一次平均压缩的值绘制的线(第一个数组的值),红线为第二次平均压缩后绘制的曲线。

 

三、峰值检测

1.原理及实现

峰值检测在示波器应用中比较常见,所以就直接贴出来了。这里起始就是找出最值然后抽取保存即可,如每3个取最大值保留。


2.结果测试

 

将sin值压缩一般,结果导入matlab后绘图如下:

 

附:导入数据后的matlab程序

 

%MATLAB程序
close all;
clear,clc;

%% 压缩测试
% 原始信号
t =  [ 0.000000  1.000000  2.000000  3.000000  4.000000  5.000000  6.000000  7.000000  8.000000  9.000000  10.000000  11.000000  12.000000  13.000000  14.000000  15.000000  ];
s =  [0.000000  0.841471  0.909297  0.141120  -0.756802  -0.958924  -0.279415  0.656987  0.989358  0.412118  -0.544021  -0.999990  -0.536573  0.420167  0.990607  0.650288 ];


%% 普通压缩
t1 =  [ 0.000000  2.000000  4.000000  6.000000  8.000000  10.000000  12.000000  14.000000  ];
s1 =  [ 0.000000  0.909297  -0.756802  -0.279415  0.989358  -0.544021  -0.536573  0.990607  ];

figure;
plot(t,s,t,s,'bo');
grid on;
hold on;
plot(t1,s1,'r*',t1,s1,'r');
hold off
title('普通压缩');

%% 平均压缩
t2 =  [ 0.000000  1.000000  2.000000  3.000000  4.000000  5.000000  6.000000  7.000000  8.000000  9.000000  10.000000  11.000000  12.000000  13.000000  14.000000  15.000000  ];
s2 =  [ 0.000000  0.799397  0.863833  0.134064  -0.718962  -0.910978  -0.265445  0.624137  0.939890  0.391513  -0.516820  -0.949991  -0.509744  0.399159  0.941077  0.617773  ];

figure;
plot(t,s,t,s,'bo');
grid on;
hold on;
plot(t2,s2,'mp',t2,s2,'m');
hold off
title('平均压缩');

%% 峰值检测
t3 =  [ 0.000000  3.000000  5.000000  6.000000  9.000000  11.000000  12.000000  15.000000  ];
s3 =  [ 0.000000  0.141120  -0.958924  -0.279415  0.412118  -0.999990  -0.536573  0.650288  ];

figure;
plot(t,s,t,s,'bo');
grid on;
hold on;
plot(t3,s3,'mh',t3,s3,'m');
hold off
title('峰值检测(最小值)压缩');


==================================================

 

OK,压缩算法随笔。

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值