matlab生成HEX文件-任意信號 大于64K長度

HEX文件格式不贅述,寫里直接放上代碼。請批評改正。

 1 %%convert a signal data into hex file format
 2 % data format:16bit 
 3 % signal length: less than 2^24-1
 4 % author: Yang Li yangli0534@gmail.com
 5 % data:2015.01.27
 6 
 7 clear all;
 8 close all;
 9 clc;
10 
11 %% fixed point or binary16 float point
12 fixed=1;
13 %% generate a signal waveform
14 %
15 T=10;%time length
16 fs=1e3;%sample rate
17 N=10000;
18 Period=N/fs/10;
19 f=1/Period;
20 t=linspace(0,(N-1)/fs,N);
21 
22 %data=1:2^5-1; 
23 data= sin(2*pi*f*t) +(rand(1,N)-0.5)/10;
24 % data=mod(50000*t,1000);
25 % plot(t,data)
26 dataBits=16;
27 byteBits=8;
28 
29 %% convert into 16 bits fixed point number
30 if fixed == 1
31     maximum=max(abs(data));%maximum of absolute signal 
32     scale=(2^15-1)/maximum;%scale 
33     data=round(data*scale);
34     for i=1:1:length(data)
35         if data(i) <0 
36             data(i) =2^16-abs(data(i)) ;
37         end
38     end
39 end
40 %% write
41 fh=fopen('data.hex','w');%open a new file (file path, file name)
42 bytesEveryRow=16;%write 16 bytes every row
43 dataEveryRow=bytesEveryRow/(dataBits/byteBits);%number of data every row
44 lengthData=length(data);%length of signal data
45 rowLengths=ceil(lengthData/dataEveryRow);%number of rows of the file to be written
46 
47 for i=1:rowLengths % write a row each time
48     if(mod(i,hex2dec('1000'))==1)
49         baseaddr=dec2hex(floor(i/hex2dec('1000')),4);
50         checkSum=6+hex2dec(baseaddr(1:2))+hex2dec(baseaddr(3:4));
51          checkSum=(dec2hex(bitand(256-mod(checkSum,256),255),2));
52         fprintf(fh,[':02000004',baseaddr,checkSum,13,10]);%產生HEX碼(end-1:end)
53     
54     end
55     checkSum=0;
56     addr=dec2hex(mod((i-1)*16,hex2dec('10000')),4);%the start address of this row
57     checkSum=hex2dec(addr(1:2))+hex2dec(addr(3:4));
58     if i*dataEveryRow <lengthData %  numbers of data to be written greater than dataEveryRow
59         dataRow=dataEveryRow;
60         dataHex='';
61         for j=8*(i-1)+1:1:8*(i)            
62             if fixed == 1%                
63                 dataHexCurr=dec2hex(data(j),4);%16 bits fixed point
64              else
65                 dataHexCurr=num2binary16hex(data(j));%number format: 16bits floatIEEE 754 half precison float point standard,result is a hex format
66              end
67             checkSum=checkSum+hex2dec(dataHexCurr(1:2))+hex2dec(dataHexCurr(3:4));
68             dataHex=strcat(dataHex,dataHexCurr);
69         end    
70             
71     else
72          dataHex='';
73          dataRow =lengthData-(rowLengths-1)*dataEveryRow;
74         for j=(rowLengths-1)*dataEveryRow+1:1:lengthData            
75              if fixed == 1% 
76                 dataHexCurr=dec2hex(data(j),4);%16 bits fixed point
77              else
78                 dataHexCurr=num2binary16hex(data(j));%number format: 16bits floatIEEE 754 half precison float point standard,result is a hex format
79              end  
80             checkSum=checkSum+hex2dec(dataHexCurr(1:2))+hex2dec(dataHexCurr(3:4));
81             dataHex=strcat(dataHex,dataHexCurr);
82         end
83     end
84    checkSum=checkSum+dataRow*dataBits/byteBits;
85     checkSum=(dec2hex(bitand(256-mod(checkSum,256),255),2)); 
86 %     disp([num2str(i),'--',dataHex,'--',checkSum])
87     fprintf(fh,[':',dec2hex(dataRow*dataBits/byteBits,2),addr,'00',dataHex,checkSum,13,10]);%產生HEX碼(end-1:end)
88 end
89 
90 fprintf(fh,':00000001FF');    
91 fclose(fh);

代碼中有定點浮點兩種,其中浮點格式為IEEE754標準中的half-precision-floating point, 16bit, 1bit 浮號位,5bit指數位,10小數位,代碼如下:

 1 function [ hex ] = num2binary16he( number )
 2 %The IEEE 754 standard specifies a binary16 as having the following format:
 3 
 4 %Sign bit: 1 bit
 5 %Exponent width: 5 bits
 6 %Significand precision: 11 bits (10 explicitly stored)
 7 %S EEEEE MMMMMMMMMM
 8 %INPUT: number is a random precision number
 9 
10 %OUTPUT : var binary is a 2's string of the binary16
11 %         var decimail is the value of the number in decimal
12 
13 %Author :Yang Li .
14 %Email: yangli0534@gmail.com
15 if real(number) >= 2^14  
16     error('beyond the maximum :-2^14--+2^24');
17 end
18 
19 S=number<0 ;
20 E=0; 
21 M=abs(number);
22 while((E>-15 && E<15)&&( M>=2 || M<1 ))
23     if(M>=2)
24      E=E+1;
25      M=M/2;
26     else
27         E=E-1;
28         M=M*2;
29     end    
30 end
31 if ((E==-15 || E==15)&& M>=2 || M<1)
32     M=0;
33 else
34     M=round((M-1)*2^10) ; 
35 end
36 
37 
38   number1=(-1)^S*(2^ E   )*(1+M/2^10);
39 % binary=strcat(num2str(S),num2str(E),num2str(M)) 
40 E =E+15;
41 binary=strcat(num2str(S),dec2bin(E,5), dec2bin(M,10)) ;
42 
43 
44 sReal=(str2double(binary(1)));
45 eReal =-15; 
46  for i=2:6
47     eReal=eReal+str2double(binary(i))*2^(6-i);
48  end    
49 %  eReal=eReal*(-1)^str2double(binary(2));
50  mReal = 0; 
51 for i=7:16
52     mReal=mReal+str2double(binary(i))*2^(16-i);
53 end 
54  
55 numberReal=(-1)^sReal*2^eReal*(1+mReal/2^10);
56 err=num2str(abs(number-numberReal));
57 decimal=numberReal;
58 % disp(['the origin data is : ',num2str(number)]);
59 % disp(['the float format is : ',binary]); 
60 % disp(['so ,there is a error :',num2str(abs(number-numberReal))]);
61 
62 num=0;
63 for i=1:16
64     num=num+str2double(binary(i))*2^(16-i);
65 end
66 hex=dec2hex(num,4);
67 end

?

轉載于:https://www.cnblogs.com/hiramlee0534/p/4262400.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376282.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376282.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動端網頁中ViewPort的使用

<meta name"viewport" content"widthdevice-width,target-densitydpihigh-dpi, initial-scale1.0, minimum-scale1.0, maximum-scale1.0, user-scalableno"> <meta name”viewport” content”widthdevice-width, initial-scale1.0, user-scalabl…

c++ socket學習(1.6)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 這次來看看UDP 之前在c socket學習&#xff08;1.2&#xff09;講過UDP怎么發送了&#xff0c;那現在來做一個可以一直發送的。 這次沒有什么接收端和發送端了&#xff0…

redis學習筆記——(1)

1. NoSQL&Redis介紹 NoSQL&#xff0c;Not Only SQL&#xff0c;是非關系型的數據庫。傳統的關系數據庫不能滿足超大規模和高并發的應用。 是以Key-Value的形式存儲&#xff0c;&#xff08;例如JSON,XML&#xff09;&#xff0c;不一定遵循傳統數據庫的一些基本要求&#…

命令模式堅決svn樹沖突(local unversioned, incoming add upon update)

當工作目錄修改刪除過時更新使用svn更新就容易發生樹沖突“Tree Confilict”.會出現類似提示。 local unversioned, incoming add upon update1local unversioned,incoming add upon update如果使用圖形化客戶端可以通過對比文件和解決沖突按鈕進行解決&#xff0c; 如果是使用…

c++ vector學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 目錄隱式成員函數1.operator &#xff08;賦值給容器&#xff09;2.assign &#xff08;將值賦給容器&#xff09;元素訪問3.at &#xff08;訪問指定元素&#xff0c;進行下標檢查&#xff09;4.operat…

linux關閉聲音

對于CentOS/Redhat/RHEL/Fedora系統&#xff0c;使用root身份執行&#xff1a;echo "alias pcspkr off" >> /etc/modprobe.conf轉載于:https://www.cnblogs.com/keethebest/p/3434821.html

Bundle Identifier

Bundle Identifier : 產品的唯一標識符 1.在模擬器上面&#xff0c;只能有一個唯一的標識符的應用程序 2.在AppStore上&#xff0c;所有的應用程序的Bundler ID都是唯一的 Bundle ID 公司的反向域名 產品名 Bundle ID 不支持中文&#xff0c;因此如果是上架產品&#xff0c;需…

c++ array學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 array和vector的區別是array是和C中的數組類似&#xff0c;不能動態改變數組大小&#xff0c;所以會比vector少很多函數。 目錄隱式定義的成員函數1.operator &#xff08;將另一個容器拷貝過來&#x…

lucene4入門(2)搜索

歡迎轉載http://www.cnblogs.com/shizhongtao/p/3440479.html 接著上一篇&#xff0c;這里繼續搜索&#xff0c;對于搜索和創建一樣&#xff0c;首先你要確定搜索位置&#xff0c;然后用規定的類來讀取。還要注意一點&#xff0c;確定分詞器&#xff0c;因為不同的分詞器所創建…

Topcoder SRM 648 (div.2)

第一次做TC全部通過&#xff0c;截圖紀念一下。 終于藍了一次&#xff0c;也是TC上第一次變成藍名&#xff0c;下次就要做Div.1了&#xff0c;希望div1不要掛零。。。_(:зゝ∠)_ A. KitayutaMart2 萬年不變的水題。 #include<cstdio> #include<cstring> #include&…

Kadane's algorithm學習

Kadane’s algorithm 簡單來說就是用來計算數組中的連續子數組之和最大是多少 vector<int> vec; int temp 0,ans 0; for(int i0;i<vec.size();i){temp max(tempvec[i],vec[i]);ans max(temp,ans); } return ans;循環的第一行就是用來比較當前位置的值和前面數組…

好用的ajax后臺框架

dwz 簡單實用的國產jquery Ui框架 http://www.j-ui.com/#_blank轉載于:https://www.cnblogs.com/userbibi/p/3441382.html

OpenFire源碼學習之十九:在openfire中使用redis插件(上)

Redis插件 介紹 Redis是目前比較流行的NO-SQL&#xff0c;基于K,V的數據庫系統。關于它的相關操作信息&#xff0c;本人這里就不做重復了&#xff0c;相關資料可以看這個網站http://www.redis.io/(官網)、http://www.redis.cn/(中文站)。 這里本人想說的是&#xff0c;拿Redis做…

c++ queue學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 目錄成員函數1.operator &#xff08;賦值給容器&#xff09;元素訪問2.front &#xff08;訪問第一個元素&#xff09;3.back &#xff08;訪問最后一個元素&#xff09;容量4.empty &#xff08;判斷容…

沒有文件擴展“.js”的腳本引擎問題解決

安裝MinGW的時候提示沒有文件擴展“.js”的腳本引擎。原因&#xff1a;系統安裝Dreamwear、UltraEdit、EditPlus后修改了.js文件的默認打開方式。當想直接執行js腳本時就會出現此錯誤。解決辦法&#xff1a;打開注冊表編輯器&#xff0c;定位[HKEY_CLASSES_ROOT.js]這一項&…

160 - 54 eKH

環境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、IDA 3、exeinfo 查殼發現是程序無殼且用Delphi語言編寫 可以通過搜索字符串的方式定位關鍵函數地址 這里定位到是 00427B44ReadInput(a2, &v17); // 讀取輸入的usernameif ( StrL…

點賺接口(第二版)

1.查看是否有新消息 url&#xff1a;/get/message/status?user_id{user_id} method&#xff1a;get response&#xff1a; {"code": "ok","msg": "","data": 0 //新消息數目 } 2.獲取消息列表 url&#xff1a;/get/messa…

Java基礎之線程——使用Runnable接口(JumbleNames)

控制臺程序。 除了定義Thread新的子類外&#xff0c;還可以在類中實現Runnable接口。您會發現這比從Thread類派生子類更方便&#xff0c;因為在實現Runnable接口時可以從不是Thread的類派生子類&#xff0c;并且仍然表示線程。Java只允許有單個基類&#xff0c;如果類派生于Thr…

cpri帶寬不足的解決方法_白皮書:FPGA賦能下一代通信和網絡解決方案(第四部分)...

對PCIe Gen 5的支持除了以太網和存儲控制器&#xff0c;Speedster7t FPGA上提供的對PCIe Gen 5的支持還能夠與主機處理器緊密集成&#xff0c;以支持諸如sidecar智能網卡(SmartNIC)設計等高性能加速器應用。PCI Gen 5控制器使其能夠讀取和寫入存儲在FPGA內存層級結構中的數據&a…

laravel里面使用event

模式&#xff1a;大概是通過一個自定義的event&#xff0c;一個handler&#xff0c;還有一個binder&#xff0c;然后用來簡化通知模型 生成自定義的event ./artisan make:event MyEvent 生成自定義的handler ./artisan handler:event MyEventHandler --eventMyEvent 然后在Even…