基于FFT和LZW波形數(shù)據(jù)壓縮_第1頁
基于FFT和LZW波形數(shù)據(jù)壓縮_第2頁
基于FFT和LZW波形數(shù)據(jù)壓縮_第3頁
基于FFT和LZW波形數(shù)據(jù)壓縮_第4頁
基于FFT和LZW波形數(shù)據(jù)壓縮_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于FFT的電能質(zhì)量波形數(shù)據(jù)的LZW壓縮算法第一章 緒論1.1前言隨著科技的進步,現(xiàn)代電力系統(tǒng)中用電負荷結(jié)構(gòu)發(fā)生了重大變化。其非線性、沖擊性以及不平衡等的負荷特性,使電網(wǎng)的電壓波形發(fā)生畸變或引起電壓波動和閃變以及三相不平衡,甚至引起系統(tǒng)頻率波動等,對供電電能質(zhì)量造成嚴重的干擾或污染。電網(wǎng)正面對越來越多的電能質(zhì)量問題,這使得電能質(zhì)量的研究十分緊迫。在電能質(zhì)量監(jiān)控方面,有兩個趨勢:其中之一是智能化,智能化旨在減輕人的勞動,能自動對電能質(zhì)量問題進行識別和數(shù)據(jù)處理,從而實現(xiàn)全面的無人監(jiān)控功能。另一個則是遠程化。隨著電力工業(yè)的發(fā)展和電網(wǎng)規(guī)模的擴大,供電部門和用戶都迫切需要對較大量的監(jiān)測點進行監(jiān)控,然而各

2、點的分散,距離遠近不同,監(jiān)測電能質(zhì)量的問題也根據(jù)用戶和電網(wǎng)的需要而各不相同。所以遠程化就可以適應(yīng)不同層次的監(jiān)控要求,從而使電能質(zhì)量的監(jiān)控點能夠分布到電網(wǎng)中的任何地方,并且具有良好的在線功能。而遠程化必然帶來的問題就是,監(jiān)測點和監(jiān)控站之間的通信問題以及大量的電能質(zhì)量數(shù)據(jù)的傳輸問題都十分重要。因此對數(shù)據(jù)進行壓縮是減少數(shù)據(jù)存儲費用和提高性能的有效辦法,具有重大的實際意義。電能質(zhì)量分析儀表需要采集大量的三相電數(shù)據(jù),從數(shù)據(jù)中解析出工業(yè)用電的各種參數(shù),以便指導(dǎo)生產(chǎn)過程。而由于嵌入式設(shè)備本身的CPU處理能力、通信能力和存儲能力所限,要求對采集到的大量數(shù)據(jù)先進行壓縮然后再傳輸、存儲和分析等,以緩解嵌入式設(shè)備的

3、通信帶寬低、存儲容量小、計算能力弱等缺點帶來的不便。1.2 國內(nèi)外研究近況隨著計算機技術(shù)的飛速發(fā)展,數(shù)據(jù)壓縮作為海量信息存儲和傳輸?shù)闹渭夹g(shù)受到了人們的極大重視。目前,對于數(shù)據(jù)壓縮算法的研究主要集中在數(shù)字圖像處理、語音信號的分析等研究領(lǐng)域,也已經(jīng)取得了顯著的成果,而數(shù)據(jù)壓縮技術(shù)在電力系統(tǒng)中的應(yīng)用則相對較少。目前電能質(zhì)量問題主要的分析方法可分為時域、頻域和基于數(shù)學變換的分析方法三種。時域分析方法如差值法等,主要用于電能質(zhì)量擾動信號的檢測,方法快速簡單,適合于檢測電壓凹陷、暫態(tài)脈沖等暫態(tài)電能質(zhì)量問題,而不能檢測如電壓偏差、諧波、周期性陷波等穩(wěn)態(tài)、周期性電能質(zhì)量問題。頻域分析方法主要用于電能質(zhì)量中的

4、諧波問題的分析,包括頻譜分布、諧波潮流計算等。基于數(shù)學變換的分析方法主要有傅立葉變換方法、矢量變換方法以及近年出現(xiàn)的小波變換方法和人工神經(jīng)網(wǎng)絡(luò)分析方法等。傅立葉變換作為經(jīng)典的信號分析方法具有正交、完備等許多優(yōu)點,如FFT 這樣的快速算法。在頻域,傅立葉變換具有較好的局部化能力,特別是對于那些頻率成分比較簡單的確定性信號,傅立葉變換很容易把信號表示成各頻率成分的疊加和形式;但在時域中,傅立葉變換是對整個時間段的積分,沒有局部化能力。由于小波分析方法具有良好的時-頻局部化特性,它通過對不同的頻率成分采用逐漸精細的采樣步長,可以聚焦到信號的任意細節(jié),能很好地處理微弱或突變信號,特別適合于對非穩(wěn)態(tài)畸變

5、波形問題進行分析。1.3 本文任務(wù)本文針對提供的離線電能質(zhì)量波形文件進行壓縮,利用了有損壓縮和無損壓縮的結(jié)合;有損壓縮部分是利用了對數(shù)據(jù)FFT之后的取閥值省去了一部分接近于0的數(shù)據(jù),無損部分選擇了對于重復(fù)性比較高的數(shù)據(jù)壓縮效率高的LZW算法。壓縮完后,再解壓,計算諧波,諧波精度仍然要滿足以下要求: 表 1 壓縮要求壓縮率要求:保證精度的要求下壓縮率越高越好。壓縮速度: 優(yōu)先級較低。第二章 FFT2.1 快速傅立葉變換傅立葉變換在頻域具有良好的局部化能力,可以較好地描述信號的頻率特性,適合用于諧波等電力系統(tǒng)穩(wěn)態(tài)或穩(wěn)態(tài)擾動現(xiàn)象的分析,如果信號為穩(wěn)態(tài)擾動(如正弦波形、諧波等),采用快速傅立葉變換對信

6、號進行壓縮,得到相應(yīng)的頻率譜,記錄了原始信號中不同頻率成分的分量,于是這里選擇了傅立葉變換沒有選擇對于暫態(tài)擾動有優(yōu)勢的小波變換。變換之后只要記住其中較大的系數(shù),即可記錄原始擾動數(shù)據(jù)中的大部分信息,達到壓縮數(shù)據(jù)的目的,這里便成為有損壓縮精度損失的來源。2.2 離散傅立葉變換(DFT)DFT是信號分析與處理中的一種重要變換。因直接計算DFT的計算量與變換區(qū)間長度N的平方成正比,當N較大時,計算量太大,所以在快速傅里葉變換(簡稱FFT)出現(xiàn)以前,直接用DFT算法進行譜分析和信號的實時處理是不切實際的。直到發(fā)現(xiàn)了FFT算法,這種情況才發(fā)生了改變。當序列的點數(shù)不超過時,它的點定義為 (1)反變換定義為

7、(2)二者形式相似,快速算法的原理一樣,這里先就其正變換進行討論。令,當依次取為時,可表示為如下的方程組: (3)由上式可見,直接按照定義計算點序列的點時,每行含個復(fù)乘和個加,從而直接按定義計算點的總計算量為個復(fù)乘和個加。當較大時,很大,計算量過大不僅耗時長,還會因字長有限而產(chǎn)生較大的誤差,甚至造成計算結(jié)果不收斂。所謂快速傅里葉變換就是能大大減少計算量而完成全部點計算的算法。下面介紹兩種經(jīng)典的算法基于頻域抽取和時域抽取的算法。2.2.1 基于頻域抽取基2FFT算法這里僅介紹基2算法,即是2的整次冪的情況。由定義 (4)把分成兩半,即和,代入(4)式得 (5)由于(5)式兩項又可合并為 (6)當

8、為偶數(shù)時,注意到,(6)式變?yōu)?(7)當為奇數(shù)時, ,(6)式變?yōu)?(8)這樣就把一個點序列()的點()計算化成了兩個點序列(和)的點(和)計算。由劃分成和的計算量為個加,即和和個乘,即由于算出的點,是的點()中為偶數(shù)的那一半,由算出的則是為偶數(shù)的那一半,故需要把偶數(shù)的抽出來放在一起作為的()輸出,同時把奇數(shù)的抽出來放在一起作為的()輸出。由于是頻域變量,故這種算法稱為頻域抽取的算法。接著,兩個點仍可用上述方法各經(jīng)個乘個加劃分成兩個點(同時還要做相應(yīng)的頻域抽?。瑥亩矂澐殖?個點,總劃分計算量仍是個加和個乘。這樣的劃分可一步步做下去,不難看出,每步的總劃分計算量都是個加和個乘。經(jīng)過步的劃分后

9、就劃成了個如下兩點的計算問題 (9)上式所需計算量是2個加和1個乘,于是完成個兩點的總計算量仍是個加和個乘。從而完成全部點的總計算量個加和個乘,這比直接按定義計算所需的個乘和加要少得多。例如,用算法計算所需的乘法個數(shù)為,而直接按定義計算所需的乘法個數(shù)為,二者相差倍。若直接計算需半小時,而用計算只需9s即可完成,可見其效率之高,而且越大,的效率提高越明顯。f0 F0000 F0 F0000f1 -1 W20 F4100 F2 F1001 gnf2 -1 W40 F2010 F4 F2010f3 -1 W41 -1 W20 F6110 F6 F3011f4 -1 W80 F1001 F1 F410

10、0f5 -1 W81 -1 W20 F5101 F3 F5101 pnf6 -1 W82 -1 W40 F3011 F5 F6110f7 -1 W83 -1 W41 -1 W20 F7111 F7 F7111圖1 頻域抽取的8點FFT計算流圖一般情況下,由于做了次分奇偶的抽取,此算法最后的個兩點計算出的不是順序抽取的。次序的變化可用二進碼來說明:第一次抽取所分的奇偶是由二進碼第1位是1或0來區(qū)分的,該位為0時為偶數(shù),該位為1時為奇數(shù),第二次抽奇偶是由二進碼第2位是1或0來區(qū)分的,每次抽取都是把偶數(shù)項放在前(左)邊,把奇數(shù)項放在后(右)邊,從而抽取以后數(shù)的二進碼是按照二進制位從左向右依次排列的,

11、和普通二進制數(shù)從右向左依次排列的的規(guī)律正好相反,所以稱為倒位序。在計算出之后要把倒位序變成順序。所謂逆變換是指由求的計算,若直接按定義做計算,則除了求和號和正變換相同的計算量外,每算一個都還需再多做一個乘的乘法運算。故按定義完成全部點的總計算量是個加和個乘。下面從圖導(dǎo)出它的快速算法,先討論第3列的2點的逆運算如何完成。由式(7)得,由上式不難解出 (10)F0000 F0 F0000 1/8 f0F1001 F2 F4100 1/8 W2-0 -1 f1F2010 F4 F2010 1/8 W4-0 -1 f2F3011 F6 F6110 1/8 W2-0 -1 W4-1 -1 f3F4100

12、 F1 F1001 1/8 W8-0 -1 f4F5101 F3 F5101 1/8 W2-0 -1 W8-1 -1 f5F6110 F5 F3011 1/8 W4-0 -1 W8-2 -1 f6F7111 F7 F7111 1/8 W2-0 -1 W4-1 -1 W8-3 -1 f7圖2 頻域抽取的8點IFFT計算流圖此計算過程如圖2所示,可以看出:左邊各列的劃分計算也都是由個碟形運算來完成的,只是各碟形運算所乘的相移因子不同。把每個碟形運算都用圖的辦法變成對應(yīng)的逆運算,并把它們按輸入在左、輸出在右重新排列,就得到了全部點的計算流圖。給出了的示例,圖中先對順序輸入的做次的頻域抽取,并把個乘的

13、運算合成了一個乘的運算放在了最前邊,然后就開始做求逆的碟形運算。2.2.2基于時域抽取的基2FFT算法比較正變換和反變換的定義式可見,去掉乘的運算,把換成,交換、和、,反變換定義式就變成了正變換的定義式。對圖2做這些變換,則得到圖3的流程圖。對圖1做這些變換,則得到圖4的流程圖。這就是時域抽取的算法流圖。進行碟形運算之前,先要對順序的時域輸入序列進行次的奇偶抽取,故稱為時域抽取的算法。f0000 f0 f0000 F0f1001 f2 f4100 W20 -1 F1f2010 f4 f2010 W40 -1 F2f3011 f6 f6110 W20 -1 W41 -1 F3f4100 f1 f

14、1001 W80 -1 F4f5101 f3 f5101 W20 -1 W81 -1 F5f6110 f5 f3011 W40 -1 W82 -1 F6f7111 f7 f7111 W20 -1 W41 -1 W83 -1 F7圖3 時域抽取的8點FFT計算流圖這里先算出個兩點的 (11)f01/8 F0000 F0 F0000f11/8 -1 W2-0 F4100 F2 F1001 f21/8 -1 W4-0 F2010 F4 F2010f31/8 -1 W4-1 -1 W2-0 F6110 F6 F3011f41/8 -1 W8-0 F1001 F1 F4100f51/8 -1 W8-1

15、-1 W2-0 F5101 F3 F5101f61/8 -1 W8-2 -1 W4-0 F3011 F5 F6110f71/8 -1 W8-3 -1 W4-1 -1 W2-0 F7111 F7 F7111圖4 時域抽取的8點IFFT計算流圖然后把個兩點的組合成個4點的,再把個4點的組合成個8點的,經(jīng)過次的組合之后,就得到了順序點計算結(jié)果。圖5就給出了用FFT算法與直接DFT算法所需乘法次數(shù)的比較曲線:圖5 FFT算法與直接DFT算法所需乘法次數(shù)的比較曲線2.3 基2FFT算法編程以頻域抽取的基2 FFT正變換為例,對FFT的信號流圖進行討論,以找到FFT算法的規(guī)律。1)分級在進行變換的過程中,

16、從點到兩點共分了M級,如圖1所示,從左到右依次為級,級,級。2)倒位序在頻域抽取的基2 FFT算法中,輸出數(shù)據(jù)不是按照序列的先后順序排列的,這是由于變換過程中,輸出按奇、偶抽取的緣故。如果將序列中標號用二進制值表示,那么在FFT信號流圖輸入端,位于處,稱為倒序。以8點FFT為例,順序和倒序的關(guān)系如表2所示。表2 順序和倒序?qū)φ毡眄樞虻剐蚴M制數(shù)二進制數(shù)二進制數(shù)十進制數(shù)012345670 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 10 0 01 0 00 1 01 1 00 0 11 0 10 1 11 1 104261537從表1可以看出,一個自然順序二進制數(shù),

17、是在最低位加1,逢2向左移位;而倒序數(shù)的順序是在最高位加1,逢2向右移位。用表示順序數(shù),表示倒序數(shù),表示位權(quán)重。對于一個倒序數(shù)來說,下一個倒序數(shù)可以按下面的方法求:先對最高位加1,相當于十進制運算。如果,說明二進制最高位為0,則直接由得到下一個倒序值;如果,說明二進制最高位為1,則將的最高位變?yōu)?,通過實現(xiàn),同時令,接著判斷次高位是否為0,直到位為0時,令。歸結(jié)起來算法流程圖如圖6所示。輸出j=N/2i=1 to N-2t=fifj=fifi= fjk=N/2j=j-kk=k/2kjj=j+ki<j是是否否 輸入N, 信號fNM=log2Nl=1 to lbr=(l-1)×2m

18、-1n=(l-1): la: N- 2m=1 to Mla=2M+1-m lb=la/2lc=n+lbt=fn+flcflc=(fn-flc) WNrfn=t倒位序重排信號輸出 圖6 倒位序程序流程圖 圖7 頻域抽取FFT程序流程圖3)蝶形運算單元和同址計算頻域抽取的信號流圖中,基本的運算結(jié)構(gòu)如圖8所示,該運算結(jié)構(gòu)的形狀像蝴蝶,故稱為“蝶形運算單元”。在這一結(jié)構(gòu)中,DFT和IDFT運算關(guān)系分別為 (12)Fm-1p Fm pFm-1q -1 WNr Fmq (a) 兩點DFT的計算 fm-1p 1/2 fmpfm-1q WN-r -1 1/2 fmq(b) 兩點IDFT的計算圖8 頻域抽取FF

19、T算法流圖中第m級碟形單元而在時域抽取的信號流圖中,基本的運算結(jié)構(gòu)如圖9所示。在這一結(jié)構(gòu)中,DFT和IDFT運算關(guān)系分別為 (13)Fm-1p FmpFm-1q WNr -1 Fmq(a) 兩點DFT的計算fm-1p 1/2 fm pfm-1q -1 WN-r/2 fmq (b) 兩點IDFT的計算 圖9 時域抽取FFT算法流圖中第m級碟形單元其中,、分別表示該蝶形運算單元的上下節(jié)點的序號。可以看出參與運算的輸入序號,輸出序號仍為,并且該運算不涉及到其它的點,因此我們可以將輸出的結(jié)果仍然放在數(shù)組中,稱這樣的操作為同址計算。也就是說,共同占有同一個存儲單元。4)尋址和相移因子的計算時域抽取基2

20、FFT信號流圖中,每一級有個蝶形單元。每一級的個蝶形單元又可以分為若干組,每一組具有相同的結(jié)構(gòu)和因子的分布。如圖1所示,第1級分為1組,第2級分為2組,第級分為組。在第級中,相鄰組之間的間距(也即每個分組所含節(jié)點數(shù))為,每個蝶形單元的上下節(jié)點之間的距離(也即每個分組所含碟形單元數(shù))為。每組的相移因子,其中 綜合以上各步驟,得到頻域抽取FFT程序流程圖如圖7所示。第三章 LZW壓縮算法3.1 LZW基本原理詞典編碼主要利用數(shù)據(jù)本身包含許多重復(fù)的字符串的特性,用一些簡單的代號代替那些重復(fù)出現(xiàn)的字符串,從而實現(xiàn)壓縮,實際上就是利用了信源符號之間的相關(guān)性。字符串與代號的對應(yīng)表就是詞典。實用的詞典編碼算

21、法的核心就是如何動態(tài)地形成詞典,以及如何選擇輸出格式以減小冗余。這里所用到的LZW(Lempel-Ziv-Walch)壓縮編碼方法。LZW的核心思想是用短的編碼代替字符串。它不對輸入的字符串做任何分析,只是將收到的每一個新字符串添加到一張字符串表中。當已經(jīng)出現(xiàn)的字符串再次出現(xiàn),即用一個短的編碼代替該字符串,這就實現(xiàn)了壓縮。LZW 算法基本思想是將每一個字節(jié)的值都要與下一個字節(jié)的值配成一個字符對,并為每一個字符設(shè)置一個代碼。當同樣的一個字符對再度出現(xiàn)時就用代號代替這一字符對,然后再用這個代號與下一個字符配對。在配對過程中,必須建立三個表格,分別為字首表、字符表和代號表,所有字符對和代號都分別存入

22、這三個表格中,數(shù)據(jù)量大大減少,可以獲得較高的壓縮比。LZW是完全可逆的,所有信息都保留了,其符號表在壓縮和解壓縮過程中完全自生成。LZW 的優(yōu)點在于不僅可以對連續(xù)出現(xiàn)的相同字符進行壓縮,而且可以對經(jīng)常出現(xiàn)的由不同字符組成的字符串進行壓縮。相對于其他算法,LZW 算法比較有利于用硬件來實現(xiàn),實時性較好。3.2 LZW 算法的具體實現(xiàn)方法3.2.1 所定義的數(shù)據(jù)結(jié)構(gòu): Charstream:字符數(shù)據(jù)流,一個被編碼的數(shù)據(jù)序列; Character:字符,字符數(shù)據(jù)流Charstream 中的基本數(shù)據(jù)元素; Prefix:前綴,在一個字符Character 錢的一個字符序列; String:字符串,由字

23、符Character 和它的前綴Prefix 構(gòu)成; Code Word:碼字,在編碼數(shù)據(jù)流中的基本數(shù)據(jù)元素,它代表字典Dictionary 中的一個字符串String; Codestream:編碼數(shù)據(jù)流,一個由碼字Code Word 和字符Charact 組成的序列(即經(jīng)過編碼算法處理后的輸出數(shù)據(jù)流); Dictionary:字典,一個由字符串String 構(gòu)成的表,按照在字典中的索引號,每個字符串String 都被分配了一個碼字Code Word;Current Prefix:當前前綴,在編碼算法中當前正被處理過的前綴Prefix 用P 來標識; Current Character;當前字

24、符,在編碼算法中被確定的一個字符Character,通常這個字符就是在當前前綴Current Prefix 后的字符,用C 來標識; Root:根,一個單字元(String-character)的字符串; Current Code Word:當前碼字,當前正在被處理的Code Word,它用cW 來表示,它所表示的字符串用String.cW 來表示; Previous Code Word:先前碼字,在編碼數(shù)據(jù)流中限于Current Code Word 的碼字,它用pW 來表示,它所表示的字符串用String.pW 來表示。3.2.2編碼算法:(1)編碼開始時,字典包含所有可能的根,同時前綴P

25、為空;(2)讀入在字符數(shù)據(jù)流中的下一個字符C;(3)字符串P+C 存在于當前字典中嗎?YES:使P=P+C,即用字符C 擴展P;NO:把表示前綴P 的碼字輸出到編碼數(shù)據(jù)流;然后將字符串P+C 添加進字典,并定義P=C,現(xiàn)在P 僅包含一個字符C;(4)在字符數(shù)據(jù)流中還有字符嗎?1)YES:返回(2)繼續(xù)進行編碼過程;2)NO:輸出表示P 的碼字到編碼數(shù)據(jù)流編碼結(jié)束。3.2.3譯碼算法:(1)譯碼開始時字典包含所有的根;(2)讀入在編碼數(shù)據(jù)流中的第一個碼字cW(他表示一個Root)(3)輸出當前前綴字符串String.cW 到字符數(shù)據(jù)流碼字流;(4)使先前碼字pW=當前碼字cW;(5)讀入編碼數(shù)據(jù)

26、流的下一個碼字cW;(6)判斷在字典中有String.cW 嗎?YES:1)將先前前綴字符傳String.cW 輸出給字符數(shù)據(jù)流;2)使當前前綴P=String.pW;3)使當前字符C=String.cW 的第一個字符;4)將前綴字符串P+C 輸出到數(shù)據(jù)流,并將其添加進字典。(7)在編碼數(shù)據(jù)流中還有碼字嗎?YES:返回(4)繼續(xù)進行譯碼;NO:結(jié)束。第四章 基于FFT和LZW算法的對于波形的壓縮4.1 對波形FFT變換對于給定的波形數(shù)據(jù),以200MS為例,有八路數(shù)據(jù),分別為A相電壓、B相電壓、C相電壓、N相電壓(空) A相電流、B相電流、C相電流、N相電流。其中A相電壓加入5%的二次諧波和15

27、%的三次諧波兩張圖片分別為利用200ms數(shù)據(jù)所繪制的三相電壓波形和電流波形圖 10 三相電壓波形圖 11 三相電流波形因為對8個通道同時采樣,存儲的數(shù)據(jù)也是按照每個采樣點的8個數(shù)據(jù)同時存進去,讀取時也是依次讀出每個采樣點的電壓、電流數(shù)據(jù)。所以在對數(shù)據(jù)進行FFT的時候,需要做分離處理,把8組數(shù)據(jù)分離開來分別進行FFT變換,為了保證數(shù)據(jù)可以還原,分別對虛部實部進行保存。為了增加無損壓縮的效率,還要對數(shù)據(jù)進行簡化,小于一定閥值的數(shù)都以0來存儲,這樣大大降低了數(shù)據(jù)的復(fù)雜度,為后面的處理提供了保證。(具體程序見附錄)4.2 對變換好的數(shù)據(jù)進行LZW壓縮對上面FFT變換結(jié)束的實部虛部數(shù)據(jù)分別進行LZW壓縮

28、,在運行指令中輸入操作方式,源文件,目標文件即可,具體流程圖:圖12 LZW流程圖壓縮結(jié)束的數(shù)據(jù)保存在目標文件中,即完成了壓縮。(具體程序見附錄)第五章 MATLAB仿真分析由于壓縮對于諧波分量要達到一定的誤差要求,所以這里用MATLAB對壓縮前壓縮后的數(shù)據(jù)進行了仿真分析,以確保壓縮的有效性。以提供的200MS數(shù)據(jù)為例,壓縮前,先對A相數(shù)據(jù)進行采集、FFT變換并做出頻譜火柴桿圖。具體M文件及結(jié)果圖如下:close all;clear all;clc;fid=fopen('osc200ms_binary.dat','r');x=fread(fid,'flo

29、at');fclose(fid);Y=reshape(x,8,4096);%轉(zhuǎn)矩陣的型,分成8組AU=;BU=;CU=;NU=;AI=;BI=;CI=;NI=;i=1:1:4096; AU(i)=Y(1,i),BU(i)=Y(2,i),CU(i)=Y(3,i),NU(i)=Y(4,i), AI(i)=Y(5,i),BI(i)=Y(6,i),CI(i)=Y(7,i), NI(i)=Y(8,i);au=fft(AU,4096); f=(0:4095)*20480/4096;mag1=abs(au)/(4096/2);mag1(1)=mag1(1)/2;stem(f,mag1);axis(0

30、 200 0 400);圖 13 A相電壓壓縮前離散頻譜圖由圖中可以讀出主波和諧波的電壓大?。篣N=310.8488, Uh2=15.5327, Uh3=46.6167。壓縮結(jié)束后,對保存的實部虛部數(shù)據(jù)文檔進行LZW解壓縮,生成的文件同理導(dǎo)入到MATLAB中,對于A相的數(shù)據(jù)畫出離散頻譜圖:圖14 A相電壓壓縮后離散頻譜圖由圖中可以讀出此時諧波的電壓大?。篣N=310.8475, Uh2=15.5511, Uh3=46.6253;計算誤差均滿足表一中的要求。附錄1 壓縮解壓縮示例(以200ms數(shù)據(jù)為例)1. 壓縮在窗口運行如下命令,即把經(jīng)過FFT變換后的real.txt文件進行LZW壓縮,結(jié)果保

31、存在1.txt文件中:同理對虛部文件也進行壓縮。2. 解壓縮在窗口運行如下命令,即把壓縮好的1.txt文件進行解壓縮保存在real1.txt中:由結(jié)果可知達到了60多倍的壓縮。附錄 2 C語言程序/*fft 部分*/#include "math.h"#include "stdio.h"struct compx double real; double imag; compx ;struct compx EE(struct compx b1,struct compx b2) /*對兩個復(fù)數(shù)進行乘法運算*/ struct compx b3; b3.real=b

32、1.real*b2.real-b1.imag*b2.imag; b3.imag=b1.real*b2.imag+b1.imag*b2.real; return(b3);void FFT(struct compx *xin,int N) int f,m,LH,nm,i,k,j,L; double p , ps ; int le,B,ip; float pi; struct compx v,w,t; LH=N/2; f=N; for(m=1;(f=f/2)!=1;m+); nm=N-2; j=N/2; /*變址運算*/ for(i=1;i<=nm;i+) if(i<j)t=xinj;x

33、inj=xini;xini=t; k=LH; while(j>=k) j=j-k;k=k/2; j=j+k; for(L=1;L<=m;L+) /*用蝶形運算完成FFT*/ le=pow(2,L); B=le/2; /*同一蝶形結(jié)中參加運算的兩個點的距離*/ pi=3.14159; /*PI的取值也是進度損失的一部分*/ for(j=0;j<=B-1;j+) p=pow(2,m-L)*j; ps=2*pi/N*p; w.real=cos(ps); /*W為系數(shù)商,當前系數(shù)與之前系數(shù)的商*/ w.imag=-sin(ps); for(i=j;i<=N-1;i=i+le)

34、ip=i+B; /*i,ip為參加運算的兩個節(jié)點*/ t=EE(xinip,w); xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; return ; /*lzw 算法*/#include <stdio.h> #include <string.h> #include <stdlib.h> #define BITS 12 #define HASHING_SHIFT BITS-8 #de

35、fine MAX_VALUE (1 << BITS) - 1 #define MAX_CODE MAX_VALUE - 1 #if BITS = 14 #define TABLE_SIZE 18041 #endif #if BITS = 13 #define TABLE_SIZE 9029 #endif #if BITS <= 12 #define TABLE_SIZE 5021 #endif void *malloc(); /* 函數(shù)原型 */ int LZW_Compression(char *in_filename, char *out_filename); int L

36、ZW_Decompression(char *in_filename, char *out_filename); /* 內(nèi)部函數(shù) */ int find_match(int hash_prefix,unsigned int hash_character); unsigned char *decode_string(unsigned char *buffer,unsigned int code); unsigned int input_code(FILE *input); void output_code(FILE *output,unsigned int code); /* 全局變量,編碼/解

37、碼使用的內(nèi)存緩沖區(qū) */ int *code_value; unsigned int *prefix_code; unsigned char *append_character; unsigned char decode_stack4000;/* LZW_Compression() 本函數(shù)用LZW算法壓縮指定的文件,并將結(jié)構(gòu)存儲到新的文件中 */ int LZW_Compression(char *in_filename, char *out_filename) unsigned int next_code; unsigned int character; unsigned int strin

38、g_code; unsigned int index; int i; FILE *input; FILE *output; /* 分配空間 */ code_value=(int*)malloc(TABLE_SIZE*sizeof(int); prefix_code=(unsigned int *)malloc(TABLE_SIZE*sizeof(unsigned int); append_character=(unsigned char *)malloc(TABLE_SIZE*sizeof(unsigned char); if (code_value=NULL | prefix_code=NU

39、LL | append_character=NULL) printf("Fatal error allocating table space!n"); return 0; /* 打開文件 */ input=fopen(in_filename,"rb"); output=fopen(out_filename,"a"); if (input=NULL | output=NULL) printf("Fatal error opening files.n"); return 0; ; /* 壓縮 */ next_code=

40、256; for (i=0;i<TABLE_SIZE;i+) code_valuei=-1; i=0; printf("Compressing.n"); string_code=getc(input); /* * This is the main loop where it all happens. This loop runs util all of * the input has been exhausted. Note that it stops adding codes to the * table after all of the possible code

41、s have been defined. */ while (character=getc(input) != (unsigned)EOF) if (+i=1000) i=0; printf("."); index=find_match(string_code,character); if (code_valueindex != -1) string_code=code_valueindex; else if (next_code <= MAX_CODE) code_valueindex=next_code+; prefix_codeindex=string_code

42、; append_characterindex=character; output_code(output,string_code); string_code=character; /* * End of the main loop. */ output_code(output,string_code); output_code(output,MAX_VALUE); output_code(output,0); printf("n"); /* cleanup. */ fclose(input); fclose(output); free(code_value); free(

43、prefix_code); free(append_character); return 1; int find_match(int hash_prefix,unsigned int hash_character) int index; int offset; index = (hash_character << HASHING_SHIFT) hash_prefix; if (index = 0) offset = 1; else offset = TABLE_SIZE - index; while (1) if (code_valueindex = -1) return(index); if (int)prefix_codeindex = hash_prefix && append_characterindex = hash_character) return(index); index -= offset; if (index < 0) index += TABLE_SIZE; /* LZW_Decompression() 用LZW對文件進行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論