欢迎光临
我们一直在努力

数字信号处理--降采样程序

最近在处理信号时遇到采样频率过高,导致数据庞大。在后处理时导致占用资源较多,运算时间较长。因此,在满足采样定理的前提下对信号进行降采样处理。传统的商业软件都有现成的函数供调用,直接对其进行降采样。在方便使用的同时,又想了解下其背后的运算规律。从SISO的角度看,降采样的函数如同一个“黑盒”。在LabVIEW提供的降采样VI中,其程序是一个库函数,无法继续打开。因此,笨蛋熊采用最基本的预算,打开降采样的“黑盒”。

为了验证编写的程序的可靠性,笨蛋熊采用与LABVIEW对照的方式进行验证。首先,降采样的需要降采样因子,其值必须大于0,如果其值小于0,程序将报错并返回错误代码。为了简化程序,笨蛋熊只关心数据的处理结果,默认降采样因子的值大于0。在程序中,设置一个布尔量“平均”,表示是否将降采样数组的值进行均值处理。其值为FALSE(默认),VI可保持X中的每个降采样因子点。如平均的值为TRUE,降采样数组中的每个点是降采样因子输入点的均值。根据降采样的数学公式,

其中,Y是降采样后的数组。m为降采样因子,其大小为0,1,2——

,n为输入数组的长度。为是小于或等于该个数的最大整数。

接下来,我们一起开始程序编写。在平均为false的时,

首先计算输入数组的长度,与降采样因子相除后取的小于或等于该值的最小整数,作为for循环的迭代次数。不用整个输入数组长度最为迭代次数的原因是降采样后,输出数组的最长长度为原来的1/m倍。通过循环变量i*m作为数组的索引,得到的索引值极为降采样后的数组。

在平均为true的时,运算过曾略有不同,

由于k的取值范围为0~m-1,反应在数组上其长度为m,因此对输入的数组取子集,索引开始处仍然是i*m,所取长度为m。取得的数组子集求和后与m相除,得到平均之后的降采样数组。

下面看看运行结果,当平均为false时,

当平均为true时,

从上面可以看出,编写的程序与自带的VI计算结果是一样的。为了进一步验证,以采样长度为1000,归一化频率为0.03的正弦信号作为输入信号,采用降采样因子为3,平均为true时计算的结果如下,

计算结果是吻合的,也验证了所编写程序的正确性。以上是一个简单的降采样程序,用到了基本的索引数组,数组子集,for循环,移位寄存器等,能达到预期的计算结果。

以上的程序还有进一步优化的空间吗?

赞(36)
分享到: 更多

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址