Phần mềm Radio Xác định là gì?

Một phần của tài liệu Ứng dụng công nghệ SDR cho bộ thu GPS (Trang 57 - 84)

Hệ thống sóng vô tuyến định nghĩa bằng phần mềm (SDR) là một hệ thống thông tin vô tuyến mà có các thành phần thường được thực hiện trong phần cứng (ví dụ các bộ phối âm, bộ lọc, bộ khuếch đại, bộđiều chế/giải điều chế, dò tìm, vv.) thì

được thay vì thực hiện bằng cách sử dụng phần mềm trên một máy tính cá nhân hoặc máy tính nhúng khác thiết bị. Trong khi khái niệm về SDR không phải là mới, khả năng phát triển nhanh chóng của điện tử kỹ thuật số là thực hiện nhiều quá trình thực tếđã được một lần duy có thể nhất về mặt lý thuyết.

SDR cố gắng để thay thế tất cả các chức năng tương tự cho những kỹ thuật số, và đã là một mục tiêu cuối cùng kết nối một chiếc máy kỹ thuật số hoàn toàn với một ăng-ten đó làm giao diện với không khí. Mục tiêu cuối cùng này có một số hạn chế công nghệ, chủ yếu là vì bộ chuyển đổi tương tự sang số (ADC) không làm việc trong các băng tần số vô tuyến và không có băng thông yêu cầu. Việc triển khai thực hiện thường có một mô-đun tần số vô tuyến, và lấy mẫu được thực hiện ở một tần số thấp hơn.

SDR được hỗ trợ trên một số sự chuyển đổi và sắp xếp xử lý như kỹ thuật số

xử lý tín hiệu (DSP) hoặc bộ chuyển đổi kỹ thuật số sang tương tự hoặc vicevers (ADC / DAC). Một dispositive khác được sử dụng là lĩnh vực lập trình Gate Array (FPGA) trong đó có một số chức năng phần cứng (ví dụ: các chức năng logic, các khối bộ nhớ hoặc bộ vi xử lý) mà nội bộ có thểđược cấu hình bởi người dùng.

Như đã nói trước đây trong trường hợp này phần phần cứng được thực hiện bởi các phần mềm Universal nhận Peripheal (USRP) và vai trò của phần mềm được thực hiện bởi GPS-SDR.

4.2 Phân tích mã nguồn của GPS-SDR 4.2.1 Cấu trúc chương trình

Các GPS-SDR là mã trong C + +. Một số trong những khía cạnh trừu tượng hơn, và cơ chế ngăn chặn, trong C + + không được sử dụng. Chúng bao gồm tính đa hình, quá tải toán tử, và thừa kế. Trong thực tế, toàn bộ mã nguồn có thể dễ dàng

được chuyển đổi sang C thẳng bằng cách thay đổi cấu trúc lớp.

Các điểm chính của phần mềm là ý tưởng của một đối tượng luồng. Mỗi công việc riêng biệt mà bộ thu phải thực hiện được đưa cho một đối tượng rõ ràng

được đặt tên và sợi liên kết. Các đối tượng có thểđược đối xử như một hộp màu đen với một đầu vào và các đầu ra. Các đối tượng sẽđược cung cấp luồng dữ liệu thông qua một ống dẫn chặn, mà sẽ được đọc bởi phương pháp đối tượng Import(). Phương pháp này sẽ thực hiện nhiệm vụ của mình trên các dữ liệu mà nó nhận

được, và sau đó gửi dữ liệu kết quả đến đích của nó thông qua phương pháp Export(). Lưu ý rằng các đường ống chặn đạt được hai điều cùng một lúc: các

đường ống đều cho phép dữ liệu lưu lượng đến và đi từ một quá trình cũng như thời gian quá trình. Kể từ khi quá trình này sẽ ngăn chặn về Import() của nó gọi đến nếu các ống rỗng không có phân tần số thực hiện chủ đề được yêu cầu. Chủ đề được thực hiện là cần thiết khi dữ liệu được tạo sẵn cho chúng.

Các chủđề thực tế của đối tượng luồng nên trông giống như sau: while(1)

pObject->Parse(); -> nhiều hơn 1 phương pháp có thểđược ởđây pObject->Export();

}

Mẫu cho một đối tượng luồng thì như sau: typedef class OBJECT

{ private:

pthread_t thread; //Cho luồng int32 temp; public: OBJECT(); //Xây dựng ~ OBJECT(); //Phá hủy void Inport(); void Parse(); void Export(); void Start(); void Stop(); };

Các đối tượng luồng

• Bàn phím: Xử lý người dùng nhập vào từ stdio. • PVT: tính toán giải quyết Position Velocity Time. • FIFO: Lấu dữ liệu từ một trong hai USRP hoặc đĩa.

• Correlators: Quản lý tất cả các quá trình tương quan (một cho mỗi kênh) • Acquisition: Thực hiện việc mua lại (3 chếđộ: tín hiệu mạnh, vừa hay yếu). • Lịch thiên văn: phân tích các Lịch thiên văn thu thập được trong tin nhắn chuyển hướng.

• SV Chọn: Chọn các vệ tinh đểđược tìm kiếm dựa trên các niên giám

• Telemetry: Thu thập thông tin của các phần còn lại của chủđề và các giao diện với giao diện người dùng đồ họa.

Pipes

• Sự tác động lẫn nhau giữa mua lại và theo dõi: - Acq_2_Trak P: Nhận được một kết quả mua lại

- Trak_2_Acq_P: Yêu cầu mua lại bởi vì một số các kênh là trống rỗng • Sự tác động lẫn nhau giữa tương quan và các kênh:

- Corr_2_PVT_P [MAX kênh]: đầu ra đo tới PVT - PVT_2_Corr_P [MAX kênh]: đầu ra đo tới PVT

• Giải mã các Lịch thiên văn:

- Chan_2_Ephem P: Dump raw subframes tới Lịch thiên văn • Thông tin phản hồi từ người dùng:

- FIFO_2_Telem_ P: Gửi trạng thái FIFO (các nút trống rỗng, giá trị AGC) - FIFO_2_PVT_P: Gửi đến số phép đo để nav (adsbygoogle = window.adsbygoogle || []).push({});

- Acq_2_Telem_P: Gửi nỗ lực mua lại tới GUI

- PVT_2_Telem_P: Gửi nav giải pháp mới nhất tới GUI - Ephem_2_Telem_P: Gửi lịch thiên văn mới nhất đến GUI - SV_Select_2_Telem_P: Pipes gửi dự báo quốc gia SV tới GUI - PVT_2_SV_Select_P: trạng thái nav đầu ra tới việc chọn chỗ ngồi

4.2.2 Phân tích mã nguồn

Cấu trúc thư mục của mã nguồn

Hình 4.2: Cấu trúc thư mục GPS-SDR

Như chúng ta có thể thấy trên các phần mềm GPS-SDR có chín thư mục được tổ

chức như sau:

• main: khởi tạo tất cả mọi thứ (phần cứng, ống dẫn, các đối tượng và chủđề) và dễ

dàng tắt tất cả mọi thứ nếu có điều gì sai trái xảy ra. • includes: chứa các tập tin header.

• usrp: chứa một chương trình cho cấu hình USRP và một trình điều khiển DBSRX. • simd: Mở rộng đa phương tiện SIMD.

• objects: thực hiện của các đối tượng ren. • acquisition: thủ tục mua lại tín hiệu.

• documentation: Doxygen các tập tin tài liệu.

Tại trang tiếp theo, chúng tôi sẽ mô tả các thư mục quan trọng nhất. Giải thích các

đối tượng luồng riêng biệt.

MAIN

Hình 4.3: Nội dung của thư mục chính

main/main.cpp

File này có chứa hàm main(). Nó khởi tạo tất cả mọi thứ (phần cứng, ống dẫn, các

đối tượng và chủđề) và sạch sẽ tắt tất cả mọi thứ nếu có điều gì sai trái xảy ra. 1. Phân tích lập luận: thiết lập giá trị mặc định bộ thông số và ghi đè lên chúng cho phù hợp với các đối số truyền cho chương trình chính GPS-SDR.

2. Phần cứng khởi động: dò tìm phần cứng và khởi tạo nó cho chếđộ thời gian thực. Các tùy chọn có thể dò tìm được định nghĩa tại simd/cpuid.cpp

4. Đối tượng khởi tạo: tạo ra một đối tượng bàn phím để xử lý người dùng nhập, mua lại, Lịch thiên văn, dữ liệu đầu vào (USRP hoặc tập tin), các kênh tương quan, vv

5. Chủđề khởi tạo: đặt cờ chạy toàn cầu (grun) để sự thật, bắt đầu các sợi bàn phím, các PVT (Vị trí-Vận tốc-Thời gian), các FIFO, các correlators, việc mua lại, các Lịch thiên văn, các sợi vệ tinh lựa chọn và từ xa này.

6. Giữ mọi thứ đang chạy trong khi tất cả các chủ đề đang hoạt động. Kiểm tra nó mỗi 10 ms.

7. Tắt tất cả mọi thứ.

Các chức năng tương ứng (Parse_Arguments(), Hardware_Init(), Pipes_Init() và vv)

được quy định tại tập tin init.cpp, và đối tác của họ tắt máy được đặt tại shutdown.cpp.

main/init.cpp

file này khởi tạo phần cứng, các đường ống và các đối tượng ren và bắt đầu lên tất cả luồng.

main/shutdown.cpp

Dừng tất cả các chủ đề, tắt tất cả các đường ống và các đối tượng ren và xóa các biến toàn cầu. (adsbygoogle = window.adsbygoogle || []).push({});

INCLUDES

includes/includes.h

Tập tin tiêu đề includes/includes.h bao gồm tiêu chuẩn hệ điều hành các tiêu đề

(như stdlib.h, stdio.h, ctype.h, math.h, vv) và một số tập tin quan trọng khác: • # include "config.h": nhận cấu hình

• # include "signaldef.h": Xác định các thuộc tính của dữ liệu đầu vào • # include "defines.h": Định nghĩa từ SIS-GPS-200D và một số thứ khác • # include "macros.h": Macros

• # include "structs.h": cấu trúc được sử dụng cho truyền thông InterProcess • # include "protos.h": Chức năng và nguyên mẫu thread

• # include "simd.h": Bao gồm các chức năng SIMD Nó cũng bao gồm các đối tượng ren:

• # include "fft.h": đối tượng FFT điểm cốđịnh

• # include "fifo.h": Thông tưđệm dữ liệu cho inporting IF

• # include "keyboard.h": Xử lý người dùng nhập vào từ bàn phím • # include "correlator.h": tương quan

• # include "channel.h": Theo dõi các kênh • # include "acquisition.h": Mua lại

• # include "pvt.h": giải pháp PVT

• # include "ephemeris.h": Lịch thiên văn giải mã • # include "telemetry.h": kernel từ xa

• # include "select.h sv": mua ổđĩa / reacquisition quá trình • # include "process.h bài": Khởi nhận từ một tập tin

• # include "globals.h": các biến toàn cầu và đối tượng

include/globals.h

Trong file này có tuyên bố phần mềm như là biến toàn cục “extern”. Các từ khoá mở rộng được sử dụng để xác định rằng biến được khai báo trong một tập tin khác nhau. Đây là chủ yếu được sử dụng để khai báo các biến của phạm vi toàn cầu trong C + + dự án. Khi từ khoá extern sử dụng, các trình biên dịch sẽ không cấp phát bộ

nhớ cho biến.

includes/defines.h

Tập tin này định nghĩa các thông số hệ thống một số danh nghĩa. Một trong số họ, đặc biệt là liên quan tần số phát 2048000bps.

includes/config.h

Tập tin này định nghĩa các thông số cấu hình như: số lượng các kênh, số

lượng CPU. Lõi, loại dữ liệu và kênh tương quan, hoặc mua lại định nghĩa.

ACCESSORIES

accessories/misc.cpp

• void sine_gen (CPX *_dest, double_f, double_fs, int32_samps) tạo ra một quy mô

đầy đủ hình sin của tần số lấy mẫu fs e với tần số cho samps samps và đặt nó vào _dest.

• void sine_gen (CPX *_ dest, double_f, double_fs, int32_samps, double p) giống

4.2.3 Đối tượng luồng ACQUISITION

Cấu trúc của đối tượng mua lại như sau: (adsbygoogle = window.adsbygoogle || []).push({});

• Bao gồm các tiêu đề: includes.h (xem phần INCLUDES) và prn_codes.h, mà chứa các FFT của các mã PRN. Các mã này được tạo ra với Matlab, xem acquisition/prn- gen.m và acquisition/gen_fft_codes.m.

• Main acquisition thread:

Void *Acquisition_Thread(void *_arg)

{

Acquisition *aAcquisition = pAcquisition; while(grun) { aAcquisition->Import(); aAcquisition->Acquire(); aAcquisition->Export(NULL); } Pthread_exit(0);

• Acquisition:: Start(): Trên thực tế bắt đầu đề mua lại. • Acquisition:: Stop(): Trên thực tế sợi chỉ dừng lại mua lại.

• Acquisition constructor: Acquisition:: Acquisition(float_fsample, float _fif) tạo ra một số biến, lấy một số hằng số và các mã FFT, phân bổ một số bộ đệm, tạo ra sin cho lau.

• Acquisition deconstructor: Acquisition:: Acquisition () xóa tất cả mọi thứ và đóng các đường ống mua lại.

• IF Processing: Acquisition::doPrepIF(int32_type, CPX *_buff) hoàn thành tất cả

các mặt trận-up IF chế biến: tái tạo bộ đệm, trộn đến baseband, 25-Hz, 500 Hz, và 750Hz, tính toán FFT phía trước, sau đó sao chép dữ liệu FFTd vào một ma trận 2- D. Các ma trận được tạo ra theo cách như vậy để cho phép xoay tròn lừa được thực hiện mà không cần liên tục kêu gọi doRotate.

• Strong signal ccquisition: Acq_Result_S Acquisition::doAcqStrong(Int32 _sv, int32_doppmin, Int32 _doppmax) mua lại bằng cách sử dụng một 1 ms tích hợp mạch lạc.

• Mediumstrength signal acquisition: Acq_Result_S Acquisition::doAcqMedium (Int32 sv int32 _doppmin, int32 _doppmax) mua lại bằng 10 ms gắn kết hội nhập. • Weak signal acquisition: Acq_Result_S Acquisition::doAcqWeak (Int32 _sv, int32 _doppmin, int32 _doppmax) mua lại bằng 10 ms tích hợp mạch lạc và 15 tích hợp rời rạc.

• Acquire: theo request.type, thực hiện các IF chế biến và các cuộc gọi thu tín hiệu mạnh mẽ, trung bình hoặc yếu.

• Import: Chức năng này chờđợi các Trak_ 2_Acq_P ống.

• Export: Chức năng này mở file log (gọi là Acq.txt theo mặc định) và viết vào đó các loại tương quan (STRONG, MEDIUM hoặc WEAK), số lượng vệ tinh, trì hoãn, doppler, độ lớn và thành công cho mỗi vệ tinh. Sau đó, đóng file. Cuối cùng, chức năng ghi các kết quả theo dõi và đo từ xa các đường ống.

CHANNEL

Lớp Channel thực hiện các kênh, sử dụng tương quan để đóng vòng. Đây là những phương thức công khai của nó:

• Channel (Int32 chan); Tạo ra một đối tượng FFT. Nếu quy định, nó cũng mở ra một tập tin chanXX.dat.

• Channel (); tiêu hủy đối tượng FFT. Nếu quy định, nó cũng đóng file chanXX.dat. • void Start (Int32 sv, Acq Kết quả S kết quả, Int32 Corr len);

• void Stop (); Dừng Channel Thread.

• void Clear (); làm sạch biến luồng Channel.

• void DumpAccum (); Dump sự tích tụ và làm phần còn lại của chế biến • void FrequencyLock () Sử dụng FFT để kéo trong PLL

• void PLL W (float bw); thay đổi băng thông PLL • void DLL W (float bw); thay đổi băng thông DLL • void PLL (); Thực hiện các khóa giai đoạn vòng lặp • void DLL (); Làm DLL

• void báo Đại Kỷ Nguyên (); Tăng kỷ nguyên 1ms, kỷ nguyên 20ms • void xuất khẩu () Quay trở lại NCO lệnh để tương quan

• Chan Packet S getPacket ();

• void Accum (tương quan S * Corr, NCO Command S * phản hồi); quá trình tích tụ

Các lớp tương quan thực hiện một ngân hàng của các tương quan. Đây là những phương thức công khai của nó:

• Correlator(int32 chan); tương quan đề xây dựng.

• void Import(); Nhận IF dữ liệu, NCO lệnh, và kết quả acq • void Correlator (); Khởi tương quan thực tế

• void Export(); kết quảđổ vào các kênh và Danh mục chính • void Start (); Bắt đầu thread (adsbygoogle = window.adsbygoogle || []).push({});

• void Stop (); Stop thread

• void TakeMeasurement (); Đi một số phép đo

• void SamplePRN (); mẫu tất cả 32 mã PRN và đặt nó vào bảng mã • void GetPRN (Int32 sv); Nhận con trỏ hàng để cụ thể PRN

• void InitCorrelator (); Khởi tạo một tương quan / kênh với một kết quả mua lại • void DumpAccum (tương quan S * c); Dump tích lũy để kênh cho pro-cessing • void UpdateState (Int32 samps); Thông tin tương quan nhà nước

• void ProcessFeedback (NCO Command S * f);

• void Accum (tương quan S * c, CPX dữ liệu *, Int32 samps); Do sự tích lũy thực tế

• void SineGen (Int32 samps); động thế hệ wipeoff

Lớp Lịch thiên văn chiết xuất dữ liệu ephimeris từ tin nhắn hướng. Đây là phương pháp chung của nó:

• Ephemeris(); Lịch thiên văn chủđề xây dựng.

• void Parse(Int32 sv); phân tích cú pháp thông điệp dữ liệu vào giá trị thập phân • void ParsePage (Int32 sv id); Phân tích niên giám trang

• void Import(); Đọc dữ liệu từ các kênh

• void Export(); Gửi công cụđể các chủđề từ xa • void Start (); Bắt đầu thread

• void Stop (); Stop thread

• void Lock (); Khóa dữ liệu quan trọng • void Unlock (); Mở khóa dữ liệu quan trọng

• void ClearSV (Int32 sv); Dump một Lịch thiên văn (thường là từ một sự tương quan chéo phát hiện)

• void WriteEphemeris (); Viết ephemerides vào một tập tin txt • void ReadEphemeris (); Tìm hiểu ephemerides từ file txt cùng • void WriteAlmanac (); Viết alamanacs vào một tập tin Yuma • void ReadAlmanac (); Viết alamanacs từ một tập tin Yuma

• Lịch thiên văn S getEphemeris (Int32 sv) trở lại (ephemerides [sv]); Nhận các giá trị lịch thiên văn này của SV

• Int32 getIODE (Int32 sv) trở lại (iode master[sv]); Lấy IODE hiện hành cho SV này

PVT

Lớp PVT không Vị trí Vận tốc Thời gian giải quyết. Đây là những phương thức công khai của nó:

• PVT (Int32 chếđộ); PVT đề xây dựng.

• void Import (); Tìm hiểu từống Corr trong 2 nav • void Start (); Bắt đầu thread

• void Stop (); Stop thread

• void Navigate(); chính hướng nhiệm vụ, hãy gọi chức năng sau: - Void ProjectState(); dự án nhà nước đến thời đại đo lường hiện nay - Void Update Time(); dự toán GPS thời gian ở hiện tic

- Void Get Ephemerides(); có được từ Lịch thiên văn Lịch thiên văn hiện chủ đề

- Void SV TransitTime(); quá cảnh thời gian để mỗi SV

- Void SV Positions(); tính SV vị trí (cho mỗi kênh với Lịch thiên văn có giá trị) - Void SV Elevations (); tính SV góc độ cao cho mặt nạ cao

- Void SV Correct(); SV vị trí chính xác cho thời gian vận chuyển

Một phần của tài liệu Ứng dụng công nghệ SDR cho bộ thu GPS (Trang 57 - 84)