作者:桂。
時間: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('單比特量化+矩陣量化信號');