数据量化与频域分析

作者:桂。

时间:2017-03-24  18:46:24

链接:http://www.cnblogs.com/xingshansi/p/6612973.html 

声明:欢迎被转载,不过记得注明出处哦~


 

前言

本文的应用背景是:对序列信号进行频域变换,从而估计频率。但在信号处理中,通常需要对数据进行量化,以此减少量化位数从而减少数据量,另外在进行频域变换时,对频域的旋转矩阵进行量化,同样可以减少数据量。本文对应的专业术语:MonoDFT、单比特。全文主要分为:

  1)数据的量化;

  2)傅里叶旋转矩阵量化;

之前朋友问我这个问题,觉得也算一种减少数据运算量的粗糙方式,记录在此。

 

一、数据的量化

对采样的数据进行量化,量化位数可以根据需求选定,正常数据量过大的话对于高频采样难以保证精度,此处以单比特为例。即$s_{quan} = sign(s)$。

以采样率为$40Hz$为例,频率为8的信号,对比采样信号与单比特量化后的信号:

可以看出尽管由于单比特后信号成方波状,引入谐波分量误差以及其他频率的杂波,但如果仅仅为了测频——找到峰值点,则仍然是有效的。

 

二、旋转矩阵的量化

该测频方法有专业术语:MonoDFT.

即对矩阵W进行量化:

其实W对应在频率圆周上采样:

量化以后可以简化运算(比如只用加减),具体不详细讨论,给出量化示意图,以W量化成4个不同取值为例:

以8HZ信号进行频率估计:

可以看出虽然引入误差,但在信噪比合适的情况下,处理后的数据完全足以估计信号频率。

但由于误差的引入,只能对单个信号较为有效,以两个为例:

这是两个信号,但第二个频率分量已经淹没在噪声中。

给出代码:

clc;clear all;close all;
set(0,'defaultfigurecolor','w');
fs = 40;
f1 = 8;
f2 = 3;
t_end = 5;
t = 0:1/fs:t_end;
s1 = 0.35*sin(2*pi*f1*t);
s2 = sin(2*pi*f2*t);
s = s1+s2;
f = t/max(t)*fs;
N = length(t);
%====原数据-DFT
W = exp(-j*2*pi/N).^([0:N-1]'*[0:N-1]);
Sori = W*s';
%====单比特-DFT
s1 = sign(s);
Sori1 = W*s1';
%====单比特+旋转因子量化
flag1 = real(W)>imag(W);
flag2 = real(W)>(-imag(W));
W1 = flag1.*flag2;
W2 = 1j*(~flag1).*flag2;
W3 = -(~flag1).*(~flag2);
W4 = -1j*flag1.*(~flag2);
Wnew = W1+W2+W3+W4;
Sori2 = Wnew*s1';
%====figure
figure;
subplot 321
stairs(t,s,'k');grid on;
xlim([0,t_end]);
ylim([-2,2]);
subplot 322
plot(f,abs(Sori),'k');grid on;title('原始信号');
subplot 323
stairs(t,s1,'k');grid on;
xlim([0,t_end]);
ylim([-2,2]);
subplot 324
plot(f,abs(Sori1),'k');grid on;title('单比特量化信号');
subplot 325
stairs(t,s1,'k');grid on;
xlim([0,t_end]);
ylim([-2,2]);
subplot 326
plot(f,abs(Sori2),'k');grid on;title('单比特量化+矩阵量化信号');
posted @ 2017-03-24 19:49  LeeLIn。  阅读(3060)  评论(0编辑  收藏  举报