Lời nói đầu
Trong lĩnh vực truyền thông, các quá trình mã hóa và giải mã được sử dụng
nhiều với các chức năng khác nhau nhằm đảm bảo tính bảo mật, độ tin cậy cao khi
truyền tin. Do đó, việc xây dựng các phương pháp mã hóa, giải mã, việc chọn lựa
các tham số cho bộ tạo mã (encoder) và các bộ giải mã (decoder) là rất quan trọng
trong truyền tin an toàn. Cho đến nay, thông thường các phương pháp mã hóa và
giải mã chỉ được phân tích trên cơ sở phương pháp xử lý tín hiệu truyền thống,
biểu diễn theo thời gian, tần số hay không gian. Tuy vậy, dù được phân tích trên
cơ sở nào, thì việc thiết lập các bộ tạo mã hay giải mã đều được thực hiện dựa vào
các mô hình khối ở bước ban đầu. Hay nói cách khác, việc thiết lập các bộ tạo mã
hay giải mã chính là việc xây dựng một mô hình hệ thống với đầu vào là tin tức,
đầu ra là các từ mã và các biến trạng thái có trong hệ thống. Vì vậy, việc nhìn
nhận mã hóa và giải mã trên quan điểm lý thuyết hệ thống là có cơ sở thực hiện.
Đặc biệt, việc nghiên cứumã sửa sai trên quan điểm lý thuyết hệ thống có tầm
quan trọng đối với việc tìm các mã có khả năng sửa sai tốt, cần ít bit dư thừa, hay
tìm ra các mã mạnh kết hợp với khả năng quan sát, điều khiển đồng thời để tối ưu
hóa quá trình mã hóa và giải mã.
Trong khuôn khổ của môn học, mã chập được sử dụng để phân tích và làm
rõ thêm về việc biểu diễn mã trong không gian trạng thái. Ngoài ra, project còn
biểu diễn một bộ tạo mã và giải mã chập sử dụng phần mềm Matlab2010 nhằm có
cái nhìn rõ hơn về quá trình tạo mã và giải mã. Do hạn chế về thời gian tìm hiểu
nên để tài còn nhiều thiếu sót và kính mong cô chỉ bảo để đề tại được bổ sung
trong thời gian tới.
Page 1
Mục Lục
Chương 1.Lý thuyết về mã chập............................................................................................ 3
1.1.
Bộ tạo mã chập ................................................................................................. 3
1.2.
Bộ giải mã chập................................................................................................. 5
Chương 2: Mô phỏng bộ mã hóa và giải mã mã chập ............................................................. 8
2.1.
Mô hình của bộ mã hóa ..................................................................................... 8
2.2.
Kết quả mô phỏng ........................................................................................... 10
Kết luận ............................................................................................................................. 12
Tài liệu tham khảo ............................................................................................................. 13
Page 2
Chương 1.Lý thuyết về mã chập
1.1.
Bộ tạo mã chập
Mã chập là một loại mã sửa sai được sử dụng trong mã hóa kênh với từ mã
được tạo ra nhờ việc cộng các bit thông tin và các bit có trong các thanh ghi dịch.
Để tạo ra mã chập, ta dùng bộ lập mã chập có nguyên tắc hoạt động dựa vào việc
“chập” dòng bit thông tin đầu vào với đáp ứng xung của bộ tạo mã. Do đó, một
dãy thông tin nhị phân u được chia thành kí tự dk=(dk(0),…..,dk(k-1)). Các kí tự này
được ánh xạ thông qua bộ tạo mã gồm n bit. Hai tham số quan trọng của một từ
mã chập là tốc độ mã R = k/n và độ dài ràng buộc Kc = M+1 với M là số lượng
các thanh ghi dịch có trong bộ mã (độ dài ràng buộc là thời gian trải rộng của các
bit mà mỗi bít đầu vào ảnh hưởng lên). Hình 1 mô tả một bộ giải mã có tốc độ là
½, độ dài ràng buộc Kc = 3.
Hình 1. Sơ đồ khối và sơ đồ chuyển trạng thái của bộ tạo mã chập
Hình 1 cũng chỉ ra sơ đồ chuyển trạng thái tương ứng với các thanh ghi
dịch phía bên trái.Với các mã chập, việc mô tả bộ tạo mã bằng sơ đồ trạng thái sẽ
thuận lợi hơn. Nếu bộ lập mã có M thanh ghi dịch thì sẽ có 2M trạng thái S(m) với
m = 0,…,2M-1. Mỗi trạng thái được biểu diễn bởi một nút và sử chuyển đổi các
trạng thái được biểu diễn bằng các mũi tên. Trên các mũi tên mô tả bit đầu vào dk
tương ứng với các kí tự đầu ra xk được viết là dk/xk(0)x(1)k.
Biểu đồ mắt cáo (trellis diagram) trong hình 2 mô tả sự chuyển đổi các
trạng thái theo thời gian. Với mỗi đầu vào dk, biểu đồ mắt cáo sẽ có tất cả các khả
năng dịch chuyển trạng thái có thể xảy ra.
Page 3
Hình 2. Biểu đồ mắt cáo thể hiện quá trình chuyển trạng thái theo thời gian
Giả sử trạng thái ban đầu của bộ tạo mã là trạng thái S(0). Biểu đồ mắt cáo
có thể được chia thành 3 pha: Với một bản tin có chiều dài là L, sau pha khởi tạo
của M bit được mã hóa dk, sẽ có L – M segment giống hệ nhau. Sau khi bản tin có
chiều dài L được mã hóa hết, thì bộ tạo mã sẽ chuyển về trạng thái ban đầu bằng
cách thêm vào M kí tự. Do đó, chiều dài của từ mã được tăng lên LT = L + M. Kĩ
thuật thêm M kí tự này sẽ làm cải thiện khả năng bị lỗi tại điểm cuối của bản tin
được mã hóa.
Để hiểu rõ hơn về biểu đồ mắt cáo, ta xem xét hình 3. Hình 3 biểu diễn quá
trình tạo từ mã sử dụng biểu đồ mắt cáo với bản tin có độ dài 12 bit với nội dung
d= (0,1,0,1,1,0,0,1,1,1,0,0) và được 24 bit từ mã đầu ra xk
Hình 3. Ví dụ về sử dụng biểu đồ mắt cáo với đầu vào cho trước
Page 4
1.2.
Bộ giải mã chập
Có nhiều phương pháp giải mã chập. Tuy nhiên, trong project này, chúng ta
sẽ đề cập đến thuật toán giải mã chập Viterbi. Lý thuyết chung của thuật toán này
là nhằm tìm ra đường ngắn nhất có trong biểu đồ mắt cáo , đường dẫn đến một
trạng thái S(k) phải là đường ngắn nhất có thể. Thuật toán này có thể được chia
thành hai bước: 1) tính toán giá nhánh (branch metric), giá đường (path metric) và
các bit quyết định. 2) traceback. Trong pha 1, sự sai khác giữa kí tự nhận yk và tất
cả các kí tự khác mà có khả năng nhận được được tính toán. Trong trường hợp
hard decision mà các kí tự chỉ là bit 0 hoặc 1, thì khoảng cách Hamming đươc sử
dụng để tính brach metric. Khoảng cách Hamming sẽ tính số bit sai khác trong kí
tự nhận được với số bit trong các kí tự có khả năng nhận được. Trong ví dụ ở phần
1, khoảng cách Hamming có thể là 0, 1, 2. Kết quả sẽ được lưu trong path
metric.Với mỗi bước k, khoảng cách Hamming cho mỗi trạng thái Sk được tính
toán và được cộng vào path metric của các trạng thái trước đó (k-1). Trong pha
thứ 2, thuật toán Viterbi sẽ dò ngược lại để xác định ra chuỗi kí tự gần nhất. Trạng
thái ban đầu trong pha dò ngược là trạng thái có path metric thấp nhất.
Để hiểu rõ hơn về thuật toán Viterbi. Chúng ta tiếp tục xét ví dụ trong phần
1 với từ mã cuối cùng nhận được yk bị sai khác so với từ mã sau bộ lập mã xk do
quá trình truyền dữ liệu. (Hình 4)
Hình 4. Ví dụ về thuật toán Virterbi
Page 5
Sau quá trình truyền, yk bị sai khác so với xk tại những bit được tô màu đỏ
như trên hình 4. Bước đầu để giải mã kí tự thu là tạo ra bảng tra LUT mô tả sơ đồ
chuyển trạng thái. Bảng tra này được dùng để tính toán khoảng cách Hamming.
Hình 5. Ma trận chuyển trạng thái
Như trong hình 4, S(0) sẽ chuyển đến 1 trong hai trạng thái là S(0) hoặc S(2)
sau khi nhận kí tự truyền đầu tiên. Do kí tự nhận được y1 = 00, nên kí tự này sẽ
được so sánh với hai kí tự tại hai trạng thái chuyển có thể có là S(0) và S(2). Nếu
S(0)-> S(0) thì khoảng cách Hamming là 0 và nếu chuyển tới S(2) thì khoảng cách
Hamming là 2. Giá trị này sẽ được lưu lại tại các nút tương ứng bên trong mắt
cáo.Giá trị này sẽ được tiếp tục tính toán tại các mắt khác nhau sau mỗi lẫn
chuyển trạng thái và được cộng dồn cả giá trị của trạng thái trước. Tại mỗi trạng
thái, sẽ có những giá trị path metric của các trạng thái trước đó được cộng dồn ,
những giá trị này được so sánh với nhau và giá trị nhỏ hơn sẽ được trọn là path
metric tại thời điểm đó. Nối tất cả các mắt cáo có path metric nhỏ nhất tại từng
thời điểm, ta sẽ có sơ đồ chuyển trạng thái tối ưu nhất. (đường màu đỏ trên Hình
6).
Hình 6. Kết quả thực hiện pha 1 của thuật toán Virterbi
Page 6
Sau khi kết thúc pha 1, pha 2 sẽ thực hiện việc traceback dựa theo sơ đồ
chuyển trạng thái đã có của pha 1. Để khởi tạo traceback, trạng thái có path metric
nhỏ nhất sẽ được đưa vào một thanh ghi dịch 2 bit, trong ví dụ này là 00. Giá trị
này chính là con trỏ để chọn các bit lựa chọn. Quá trình traceback được mô tả
trong hình 7.
Hình 7. Quá trình Traceback
Tổ hợp các bit được đẩy ra khỏi thanh ghi dịch 2 bit tạo thành bản tin ban
đầu (các bit màu vàng). Từ đó ta kết thúc quá trình giải mã mã chập.
Page 7
Chương 2:
Mô phỏng bộ mã hóa và giải mã mã chập
Trong chương này, một bộ tạo mã chập và giải mã được xây dựng và mô
phỏng sử dụng công cụ Simulink của Matlab 2010.Đầu tiên, mô hình của bộ mã
hóa được đưa ra.Sau đó; chúng ta thiết lập sơ đồ khối sử dụng các khối trong
Simulink để thực hiện việc mã hóa và giải mã mã chập.Cuối cùng, kết quả mô
phỏng sẽ được đưa ra để kiểm chứng.
2.1.
Mô hình của bộ mã hóa
Bộ mã hóa mã chập được mô tả trong hình 8 như sau:
Hình 8. Mô hình bộ mã hóa mã chập
Mô hình trên biểu diễn bộ tạo mã có tốc độ code rate = 1/2 (1 đầu vào, 2
đầu ra), có độ dài ràng buộc là Kc = 7 (6 thanh ghi dịch + 1 đầu vào). Về mặt toán
học, bộ mã chập trên được hình thành bởi ma trận đa thức có dạng:
Từsơđồ mô hình bộ mã hóa mã chập trên, chúng ta sử dụng công cụ
Simulink của Matlab nhằm xây dựng một bộ mã hóa và giải mã mã chập với mô
hình như trong hình 8 như sau:
Page 8
Hình 9.Mô hình mã hóa và giải mã mã chập
Trong mô hình trên, quá trình mã hóa và giải mã mã chập được mô tả
thông qua 4 khối.Đầu tiên, tín hiệu bản tin bất kì được tạo ra một cách ngẫu nhiên
thôn qua bộ tạo mã nhị phân Bernoulli. Sau đó, chuỗi bit nhị phân này được đưa
lần lượt vào bộ mã hóa mã chập rồi đưa quá kênh truyền nhị phân với một xác
suất lỗi kênh truyền nhất định và cuối cùng được giải mã qua bộ giải mã sử dụng
thuật toán Virterbi. Bộ mã hóa mã chập được xây dựng bằng việc khai báo các
thông số cho biểu đồ chuyển trạng thái (Trellis structure) được có trong bộ mã hóa
mã chập. Cách khai báo như sau:
Trellis = poly2trellis ([chiều dài ràng buộc], [ hệ số trong đa thức sinh dưới dạng
bát phân])
Hàm Poly2trellis có nhiệm vụ chuyển đổi dạng đa thức sang sơ đồ chuyển
trạng thái của bộ mã hóa. Cấu trúc Trellis bao gồm các trường sau (hình 10).
Field in trellis Structure
Dimensions
Meaning
numInputSymbols
Scalar
Number of input symbols to the encoder: 2k
numOutputSymbols
Scalar
Number of output symbols from the encoder: 2n
numStates
Scalar
Number of states in the encoder
nextStates
numStates-by-2 matrix
Next states for all combinations of current state and curr
outputs
numStates-by-2 matrix
Outputs (in octal) for all combinations of current state an
k
k
Hình 10. Các trường trong cấu trúc Trellis
Page 9
Trong các trường trên thì chiều dài ràng buộc của mã chập sẽ quy định số
đầu vào mã chập. Nếu số chiều dài ràng buộc là 2 thì số đầu vào mã chập sẽ là 2
và số kí tự đầu vào sẽ là 4…Ngoài ra các hệ số trong đa thức sinh dưới dạng nhị
phân sẽ được biểu diễn dưới dạng bát phân trong cấu trúc Trellis. Vi dụ, với bộ
lập mã trong hình 8 có hai đa thức sinh với các hệ số lập thành dạng nhị phân là
(1 1 1 1 0 0 1) ứng với đầu ra của bit thứ nhất và (1 0 1 1 0 1 1), trong khai báo
Trellis, dạng nhị phân này sẽ được đổi sang dạng bát phân là hai số 171 và 133.
Với bộ mã hóa như trên, cấu trúc trellis sẽ có 27 trạng thái trong bộ mã hóa.
Để hiểu rõ hơn về quá trình mã hóa và giải mã mã chập, kết quả mô phỏng
của bộ mã hóa này sẽ được đưa ra trong phần sau.
2.2.
Kết quả mô phỏng
Với mô hình được cho trong hình 9, chúng ta thiết lập các thông số cho
từng khối như sau:
Khối tạo chuỗi bit nhị phân:
-
Proballity of a zero: 0.5
-
Initial seed: dùng hàm randseed
-
Sample time: 0.5
Khối tạo mã chập: thiết lập Trellis poly2trellis ( 7, [171 133])
Khối kênh truyền đối xứng: xét xác suất lỗi: 0.02
Khối giải mã sử dụng thuật toán Virterbi: thiết lấp tương tự khối mã chập
Chọn thời gian mô phỏng từ 0 đến 100 s.
Sau khi đã thiết lập các khối, ta tiến hành mô phỏng và thu đươc kết quả
như trên hình 11
Page 10
Bit thông
tin đầu vào
Hai chuỗi bit đầu
ra bộ mã chập
Tín hiệu sau khi
đi qua kênh
truyền
Chuỗi bit thông
tin sau giải mã
Hình 11. Kết quả mô phỏng
Từ kết quả mô phỏng, ta thấy rằng quá trình mã hóa và giải mã một chuỗi
bit thông tin bất kì đã thành công. Với xác suất lỗi kênh truyền là 2% thì bit thông
tin sau khi giải mã bằng thuật toán Virterbi giữ nguyên được nội dung tin truyền.
Page 11
Kết luận
Như vậy, quá trình mô phỏng việc mã hóa và giải mã mã chập đã được
thực hiện.Việc thiết lập mã và giải mã đều dựa vào biểu đồ mắt cáo và thuật toán
giải mã Virterbi.Sự tiện lợi của công cụ Simulink trong phần mềm Matlab cho
phép chúng ta có thể xây dựng được bất kì bộ tạo mã chập chỉ bằng cách thay đổi
các tham số trong sơ đồ khối của bộ tạo mã.
Tuy nhiên, project còn nhiều thiếu sót. Đó là chưa nêu ra được vai trò làm
giảm thiểu lỗi kênh truyền của mã chập bằng cách thiết lập mối quan hệ đồ thị
giữa tỉ số tín hiệu trên nhiễu SNR và tỉ lệ lỗi bit BER. Ngoài ra, việc xây dựng bộ
tạo mã chập theo quan điểm lý thuyết hệ thống chưa được thực hiện. Đây là những
hướng cần khắc phục trong thời gian tới của project.
Page 12
Tài liệu tham khảo
[1] Eric V. York (1997), Algebraic Description and Construction of Error
Correcting Codes: A Linear Systems point of view, Dissertation for the
degree of Philosophy Doctor of the University of Notre Dame, Notre Dame
Indiana, USA.
[2] Brian M. Allen, (1999). Linear systems analysis and decoding of
convolutional codes.
[3] www.mathwork.com
Page 13
PHỤ LỤC CODE
/* This code was developed as part of graduate coursework at EmbryRiddle Aeronautical University
* under the guidance of Dr. Pat Anderson and Dr. Hever Moncayo.
*
* Author: Robert F. Hartley
* Assistant Developers: Francois Hugon, Brian DeRosa, and Christopher
Carvalho
* Support:
*
* Oct. 25, 2012
* Version 1.0
*
*/
/*
* File: Arduino_IMU_sfcn.c
*
*
*
* --- THIS FILE GENERATED BY S-FUNCTION BUILDER: 3.0 --*
* This file is an S-function produced by the S-Function
* Builder which only recognizes certain fields. Changes made
* outside these fields will be lost the next time the block is
* used to load, edit, and resave this file. This file will be overwritten
* by the S-function Builder block. If you want to edit this file by hand,
* you must change it only in the area defined as:
*
*
%%%-SFUNWIZ_defines_Changes_BEGIN
*
#define NAME 'replacement text'
Page 14
*
%%% SFUNWIZ_defines_Changes_END
*
* DO NOT change NAME--Change the 'replacement text' only.
*
* For better compatibility with the Simulink Coder, the
* "wrapper" S-function technique is used. This is discussed
* in the Simulink Coder's Manual in the Chapter titled,
* "Wrapper S-functions".
*
* ------------------------------------------------------------------------* | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed
template |
* ------------------------------------------------------------------------* Created: Thu Aug 9 02:31:58 2012
*
*
*/
#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME Arduino_IMU_sfcn
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<*/
/* %%%-SFUNWIZ_defines_Changes_BEGIN --- EDIT HERE TO _END
*/
#define NUM_INPUTS
7
/* Input Port 0 */
#define IN_PORT_0_NAME
p_degs
#define INPUT_0_WIDTH
1
#define INPUT_DIMS_0_COL
#define INPUT_0_DTYPE
#define INPUT_0_COMPLEX
1
real_T
COMPLEX_NO
Page 15
#define IN_0_FRAME_BASED
#define IN_0_BUS_BASED
FRAME_NO
0
#define IN_0_BUS_NAME
#define IN_0_DIMS
1-D
#define INPUT_0_FEEDTHROUGH 1
#define IN_0_ISSIGNED
1
#define IN_0_WORDLENGTH
8
#define IN_0_FIXPOINTSCALING 1
#define IN_0_FRACTIONLENGTH 3
#define IN_0_BIAS
0
#define IN_0_SLOPE
0.125
/* Input Port 1 */
#define IN_PORT_1_NAME
q_degs
#define INPUT_1_WIDTH
1
#define INPUT_DIMS_1_COL
#define INPUT_1_DTYPE
1
real_T
#define INPUT_1_COMPLEX
COMPLEX_NO
#define IN_1_FRAME_BASED
#define IN_1_BUS_BASED
FRAME_NO
0
#define IN_1_BUS_NAME
#define IN_1_DIMS
1-D
#define INPUT_1_FEEDTHROUGH 1
#define IN_1_ISSIGNED
1
#define IN_1_WORDLENGTH
8
#define IN_1_FIXPOINTSCALING 1
#define IN_1_FRACTIONLENGTH 3
#define IN_1_BIAS
#define IN_1_SLOPE
0
0.125
/* Input Port 2 */
#define IN_PORT_2_NAME
#define INPUT_2_WIDTH
r_degs
1
Page 16
#define INPUT_DIMS_2_COL
#define INPUT_2_DTYPE
1
real_T
#define INPUT_2_COMPLEX
COMPLEX_NO
#define IN_2_FRAME_BASED
#define IN_2_BUS_BASED
FRAME_NO
0
#define IN_2_BUS_NAME
#define IN_2_DIMS
1-D
#define INPUT_2_FEEDTHROUGH 1
#define IN_2_ISSIGNED
1
#define IN_2_WORDLENGTH
8
#define IN_2_FIXPOINTSCALING 1
#define IN_2_FRACTIONLENGTH 3
#define IN_2_BIAS
0
#define IN_2_SLOPE
0.125
/* Input Port 3 */
#define IN_PORT_3_NAME
nx_g
#define INPUT_3_WIDTH
1
#define INPUT_DIMS_3_COL
#define INPUT_3_DTYPE
1
real_T
#define INPUT_3_COMPLEX
COMPLEX_NO
#define IN_3_FRAME_BASED
#define IN_3_BUS_BASED
FRAME_NO
0
#define IN_3_BUS_NAME
#define IN_3_DIMS
1-D
#define INPUT_3_FEEDTHROUGH 1
#define IN_3_ISSIGNED
1
#define IN_3_WORDLENGTH
8
#define IN_3_FIXPOINTSCALING 1
#define IN_3_FRACTIONLENGTH 3
#define IN_3_BIAS
#define IN_3_SLOPE
0
0.125
Page 17
/* Input Port 4 */
#define IN_PORT_4_NAME
ny_g
#define INPUT_4_WIDTH
1
#define INPUT_DIMS_4_COL
#define INPUT_4_DTYPE
1
real_T
#define INPUT_4_COMPLEX
COMPLEX_NO
#define IN_4_FRAME_BASED
#define IN_4_BUS_BASED
FRAME_NO
0
#define IN_4_BUS_NAME
#define IN_4_DIMS
1-D
#define INPUT_4_FEEDTHROUGH 1
#define IN_4_ISSIGNED
1
#define IN_4_WORDLENGTH
8
#define IN_4_FIXPOINTSCALING 1
#define IN_4_FRACTIONLENGTH 3
#define IN_4_BIAS
0
#define IN_4_SLOPE
0.125
/* Input Port 5 */
#define IN_PORT_5_NAME
nz_g
#define INPUT_5_WIDTH
1
#define INPUT_DIMS_5_COL
#define INPUT_5_DTYPE
1
real_T
#define INPUT_5_COMPLEX
COMPLEX_NO
#define IN_5_FRAME_BASED
#define IN_5_BUS_BASED
FRAME_NO
0
#define IN_5_BUS_NAME
#define IN_5_DIMS
1-D
#define INPUT_5_FEEDTHROUGH 1
#define IN_5_ISSIGNED
1
#define IN_5_WORDLENGTH
8
#define IN_5_FIXPOINTSCALING 1
Page 18
#define IN_5_FRACTIONLENGTH 3
#define IN_5_BIAS
0
#define IN_5_SLOPE
0.125
/* Input Port 6 */
#define IN_PORT_6_NAME
temp_degC
#define INPUT_6_WIDTH
1
#define INPUT_DIMS_6_COL
#define INPUT_6_DTYPE
1
real_T
#define INPUT_6_COMPLEX
COMPLEX_NO
#define IN_6_FRAME_BASED
#define IN_6_BUS_BASED
FRAME_NO
0
#define IN_6_BUS_NAME
#define IN_6_DIMS
1-D
#define INPUT_6_FEEDTHROUGH 1
#define IN_6_ISSIGNED
1
#define IN_6_WORDLENGTH
8
#define IN_6_FIXPOINTSCALING 1
#define IN_6_FRACTIONLENGTH 3
#define IN_6_BIAS
#define IN_6_SLOPE
0
0.125
#define NUM_OUTPUTS
7
/* Output Port 0 */
#define OUT_PORT_0_NAME
p_degs
#define OUTPUT_0_WIDTH
1
#define OUTPUT_DIMS_0_COL
#define OUTPUT_0_DTYPE
1
real_T
#define OUTPUT_0_COMPLEX
COMPLEX_NO
#define OUT_0_FRAME_BASED
#define OUT_0_BUS_BASED
FRAME_NO
0
#define OUT_0_BUS_NAME
Page 19
#define OUT_0_DIMS
1-D
#define OUT_0_ISSIGNED
1
#define OUT_0_WORDLENGTH
8
#define OUT_0_FIXPOINTSCALING 1
#define OUT_0_FRACTIONLENGTH 3
#define OUT_0_BIAS
0
#define OUT_0_SLOPE
0.125
/* Output Port 1 */
#define OUT_PORT_1_NAME
q_degs
#define OUTPUT_1_WIDTH
1
#define OUTPUT_DIMS_1_COL
#define OUTPUT_1_DTYPE
1
real_T
#define OUTPUT_1_COMPLEX
COMPLEX_NO
#define OUT_1_FRAME_BASED
#define OUT_1_BUS_BASED
FRAME_NO
0
#define OUT_1_BUS_NAME
#define OUT_1_DIMS
1-D
#define OUT_1_ISSIGNED
1
#define OUT_1_WORDLENGTH
8
#define OUT_1_FIXPOINTSCALING 1
#define OUT_1_FRACTIONLENGTH 3
#define OUT_1_BIAS
0
#define OUT_1_SLOPE
0.125
/* Output Port 2 */
#define OUT_PORT_2_NAME
r_degs
#define OUTPUT_2_WIDTH
1
#define OUTPUT_DIMS_2_COL
#define OUTPUT_2_DTYPE
1
real_T
#define OUTPUT_2_COMPLEX
COMPLEX_NO
#define OUT_2_FRAME_BASED
#define OUT_2_BUS_BASED
FRAME_NO
0
Page 20
#define OUT_2_BUS_NAME
#define OUT_2_DIMS
1-D
#define OUT_2_ISSIGNED
1
#define OUT_2_WORDLENGTH
8
#define OUT_2_FIXPOINTSCALING 1
#define OUT_2_FRACTIONLENGTH 3
#define OUT_2_BIAS
0
#define OUT_2_SLOPE
0.125
/* Output Port 3 */
#define OUT_PORT_3_NAME
nx_g
#define OUTPUT_3_WIDTH
1
#define OUTPUT_DIMS_3_COL
#define OUTPUT_3_DTYPE
1
real_T
#define OUTPUT_3_COMPLEX
COMPLEX_NO
#define OUT_3_FRAME_BASED
#define OUT_3_BUS_BASED
FRAME_NO
0
#define OUT_3_BUS_NAME
#define OUT_3_DIMS
1-D
#define OUT_3_ISSIGNED
1
#define OUT_3_WORDLENGTH
8
#define OUT_3_FIXPOINTSCALING 1
#define OUT_3_FRACTIONLENGTH 3
#define OUT_3_BIAS
#define OUT_3_SLOPE
0
0.125
/* Output Port 4 */
#define OUT_PORT_4_NAME
ny_g
#define OUTPUT_4_WIDTH
1
#define OUTPUT_DIMS_4_COL
#define OUTPUT_4_DTYPE
1
real_T
#define OUTPUT_4_COMPLEX
#define OUT_4_FRAME_BASED
COMPLEX_NO
FRAME_NO
Page 21
#define OUT_4_BUS_BASED
0
#define OUT_4_BUS_NAME
#define OUT_4_DIMS
1-D
#define OUT_4_ISSIGNED
1
#define OUT_4_WORDLENGTH
8
#define OUT_4_FIXPOINTSCALING 1
#define OUT_4_FRACTIONLENGTH 3
#define OUT_4_BIAS
0
#define OUT_4_SLOPE
0.125
/* Output Port 5 */
#define OUT_PORT_5_NAME
nz_g
#define OUTPUT_5_WIDTH
1
#define OUTPUT_DIMS_5_COL
#define OUTPUT_5_DTYPE
1
real_T
#define OUTPUT_5_COMPLEX
COMPLEX_NO
#define OUT_5_FRAME_BASED
#define OUT_5_BUS_BASED
FRAME_NO
0
#define OUT_5_BUS_NAME
#define OUT_5_DIMS
1-D
#define OUT_5_ISSIGNED
1
#define OUT_5_WORDLENGTH
8
#define OUT_5_FIXPOINTSCALING 1
#define OUT_5_FRACTIONLENGTH 3
#define OUT_5_BIAS
#define OUT_5_SLOPE
0
0.125
/* Output Port 6 */
#define OUT_PORT_6_NAME
temp_degC
#define OUTPUT_6_WIDTH
1
#define OUTPUT_DIMS_6_COL
#define OUTPUT_6_DTYPE
#define OUTPUT_6_COMPLEX
1
real_T
COMPLEX_NO
Page 22
#define OUT_6_FRAME_BASED
#define OUT_6_BUS_BASED
FRAME_NO
0
#define OUT_6_BUS_NAME
#define OUT_6_DIMS
1-D
#define OUT_6_ISSIGNED
1
#define OUT_6_WORDLENGTH
8
#define OUT_6_FIXPOINTSCALING 1
#define OUT_6_FRACTIONLENGTH 3
#define OUT_6_BIAS
0
#define OUT_6_SLOPE
#define NPARAMS
0.125
4
/* Parameter 1 */
#define PARAMETER_0_NAME
lpf_filt_freq_hz
#define PARAMETER_0_DTYPE
uint32_T
#define PARAMETER_0_COMPLEX COMPLEX_NO
/* Parameter 2 */
#define PARAMETER_1_NAME
gyro_scale
#define PARAMETER_1_DTYPE
uint32_T
#define PARAMETER_1_COMPLEX COMPLEX_NO
/* Parameter 3 */
#define PARAMETER_2_NAME
accel_scale
#define PARAMETER_2_DTYPE
uint32_T
#define PARAMETER_2_COMPLEX COMPLEX_NO
/* Parameter 4 */
#define PARAMETER_3_NAME
SampleTime
#define PARAMETER_3_DTYPE
real_T
#define PARAMETER_3_COMPLEX COMPLEX_NO
#define SAMPLE_TIME_0
#define NUM_DISC_STATES
SampleTime
0
Page 23
#define DISC_STATES_IC
[0]
#define NUM_CONT_STATES
#define CONT_STATES_IC
0
[0]
#define SFUNWIZ_GENERATE_TLC 0
#define SOURCEFILES "__SFB__"
#define PANELINDEX
6
#define USE_SIMSTRUCT
0
#define SHOW_COMPILE_STEPS 0
#define CREATE_DEBUG_MEXFILE 0
#define SAVE_CODE_ONLY
1
#define SFUNWIZ_REVISION
3.0
/* %%%-SFUNWIZ_defines_Changes_END --- EDIT HERE TO _BEGIN
*/
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<*/
#include "simstruc.h"
#define PARAM_DEF0(S) ssGetSFcnParam(S, 0)
#define PARAM_DEF1(S) ssGetSFcnParam(S, 1)
#define PARAM_DEF2(S) ssGetSFcnParam(S, 2)
#define PARAM_DEF3(S) ssGetSFcnParam(S, 3)
#define IS_PARAM_DOUBLE(pVal) (mxIsNumeric(pVal) &&
!mxIsLogical(pVal) &&\
!mxIsEmpty(pVal) && !mxIsSparse(pVal) && !mxIsComplex(pVal) &&
mxIsDouble(pVal))
/*====================*
* S-function methods *
*====================*/
Page 24
#define MDL_CHECK_PARAMETERS
#if defined(MDL_CHECK_PARAMETERS) &&
defined(MATLAB_MEX_FILE)
/* Function: mdlCheckParameters
=============================================
* Abstract:
*
Validate our parameters to verify they are okay.
*/
static void mdlCheckParameters(SimStruct *S)
{
int paramIndex = 0;
bool validParam = false;
/* All parameters must match the S-function Builder Dialog */
/*
{
const mxArray *pVal0 = ssGetSFcnParam(S,0);
if (!IS_PARAM_DOUBLE(pVal0)) {
validParam = true;
paramIndex = 0;
goto EXIT_POINT;
}
}
{
const mxArray *pVal1 = ssGetSFcnParam(S,1);
if (!IS_PARAM_DOUBLE(pVal1)) {
validParam = true;
paramIndex = 1;
goto EXIT_POINT;
}
Page 25