PDA

View Full Version : Dữ liệu đọc từ ROM hoặc bộ nhớ chương trình tham gia các lệnh DSP như thế nào?


uydanh
07-11-2008, 04:58 PM
Chào mọi người, đặc biệt gửi lời chào đến anh Nam ! (hehehehhe)
Cho em hỏi 1 câu như thế này. Em muốn sử dụng các lệnh DSP của dspic30. Và dĩ nhiên để đọc dữ liệu thì các dữ liệu này phải lưu trên 2 vùng nhớ X và Y của data space. Như vậy nếu muốn thực hiện tích chập 2 vecto mà một trong 2 vecto hoặc cả 2 vecto đều được lưu trên ROM hay program space memory thì quá trình thực hiện sẽ như thế nào (vì em thấy trong một số đoạn code vẫn thực hiện được). Cảm ơn rất nhiều.

namqn
07-11-2008, 05:48 PM
Chào mọi người, đặc biệt gửi lời chào đến anh Nam ! (hehehehhe)
Cho em hỏi 1 câu như thế này. Em muốn sử dụng các lệnh DSP của dspic30. Và dĩ nhiên để đọc dữ liệu thì các dữ liệu này phải lưu trên 2 vùng nhớ X và Y của data space. Như vậy nếu muốn thực hiện tích chập 2 vecto mà một trong 2 vecto hoặc cả 2 vecto đều được lưu trên ROM hay program space memory thì quá trình thực hiện sẽ như thế nào (vì em thấy trong một số đoạn code vẫn thực hiện được). Cảm ơn rất nhiều.
Bạn post những đoạn code đó lên đây và chúng ta cùng phân tích.

Thân,

uydanh
08-11-2008, 02:27 PM
Ý tưởng chương trình của em thế này :
- Dùng ADC thu thập dữ liệu lưu vào mảng inputsignal[] được lưu trên RAM
- Sử dụng bộ lọc FIR để lọc thông cao tín hiệu inputsignal[] với hệ số bộ lọc lưu trong mảng FIRpre_emphasis[] ( được lưu trong bộ nhớ chương trình) được truy cập nhờ vào không gian ánh xạ PSV.
- Tín hiệu sau khi lọc lưu vào mảng outputsignal[] lưu trên RAM
Đoạn code trích lược như sau :( em chưa hiểu cách viết lắm, chỉ dựa trên các tài liệu của của C30 và các bài viết của anh Nam nên cách viết còn nhiều chổ sai, chưa đúng, rất mong anh Nam sửa dùm em).

#include "p30f6014a.h"
#include "dsp.h"
....
....
//Luoc qua cau hinh ban dau
extern void FIRDelayInit ( FIRStruct * filter); // khai bao prototype cho ham FIRDelayInit
extern fractional * FIR (int numSamps, fractional * dstSamps, fractional * srcSamps,
FIRStruct * filter);
fractional __attribute__ ((space(auto_psv), aligned(128)))
FIRpre_emphasis[2]={0x7FFF, 0x8666}; //mang he so bo loc FIR duoc luu
// trong bo nho chuong trinh
fractional inputsignal[256]; // inputsignal mac dinh luu trong RAM
fractional outputsignal[256]; // outputsinal mac dinh luu trong RAM

int main(void)
{
........
........
// xem nhu la da co 256 mau du lieu dang fractional thu duoc tu ADC trong
// trong inputsignal[256]
FIRDelayInit(&FIRpre_emphasis);
FIR(256, &outputsignal, &inputsignal, &FIRpre_emphasis);
................
}

Anh Nam cho em hỏi một vài câu hỏi. Mong anh giảng giải giúp em.
1. Cách khai báo 1 mảng trong bộ nhớ chương trình của em như vậy là đúng hay sai, có tối ưu việc sử dụng bộ nhớ chương trình chưa?
2. aligned(128) : tức là vùng nhớ được canh lề theo 128 bytes một (theo cách giảng của anh trong tutorial 2). Nhưng thú thật em chưa hiểu nghĩa tiếng Việt của từ "canh lề" này lắm. Mong anh giảng lại giúp em.
3. Việc khai báo 2 mảng inputsignal và outputsignal như trên của em sẽ được lưu mặc định vào vùng nhớ X của RAM gần có phải ko? Vì em định thêm ..near space(xmemory) nhưng nghĩ không cần nên thôi.
4. Trong Tutorial 2 của anh, anh có khai báo một bảng giá trị cho LED trong ROM, anh viết như sau :

const unsigned __attribute__ ((space(psv), address(0x200))
......

Trong khai báo đó thì từ khóa nào để C30 nhận biết là dữ liệu được lưu trên ROM. Có thể em đã có câu trả lời nhưng em hỏi lại anh cho chắc và hiểu rõ hơn.
5. Nếu như em đoán đúng thì inputsignal sẽ được lưu trên X memory => dữ liệu từ trong hệ số bộ lọc bằng cách nào đó sẽ phải ánh xạ qua bên vùng nhớ Y memory. Anh Nam giảng giải giúp em chổ này.
6. Câu hỏi cuối cùng : trong prototype khai báo cho hàm FIR, em thấy có giá trị trả về dạng fractional nhưng em đọc hoài trong tài liệu hướng dẫn vẫn không thấy nó trả về con số gì. Vậy nó trả về con số gì vậy anh Nam.

Em biết câu hỏi hơi dài và anh không có nhiều thời gian nhưng em rất mong anh giúp em hiểu hết "đống lung tung" này. Em cảm ơn anh rất nhiều.

namqn
08-11-2008, 10:40 PM
1. Bạn đã khai báo mảng FIRpre_emphasis[] ở trong RAM, xem mục 4 phía dưới.

2. Tôi định dùng cụm từ 'chỉnh biên' khi viết tutorial, nhưng nghĩ đi nghĩ lại đã dùng cụm từ 'canh lề' cho nó bình dân hơn. Bạn hãy tưởng tượng RAM được chia thành từng khối với kích thước là một lũy thừa của 2. Việc truy cập bộ nhớ sẽ hiệu quả hơn nếu chúng ta cấp phát các vùng nhớ nằm đúng ở đầu các khối nhớ đó. Thuộc tính aligned giúp chúng ta làm việc đó.

3. Việc đặt các mảng inputsignal[] và outputsignal[] của bạn vào vùng nhớ nào, khi bạn không mô tả tường minh thông tin này, còn tùy thuộc vào kiểu bộ nhớ mà bạn chọn khi biên dịch chương trình. Bạn xem thêm mục 4.6 trong tài liệu 'MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs User's Guide' (DS51284H).

4. Từ khóa đó là const.

5. Việc cấp phát vùng nhớ X hay Y cho dữ liệu được dùng với thư viện DSP do người dùng thực hiện. Bạn đọc thêm mục 'Data Memory Usage' trong tập tin 'DSP Library.htm', nằm trong thư mục con 'docs\dsp_lib' của thư mục cài đặt MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs.

6. Cũng trong thư mục đã đề cập ở mục 5, bạn có thể tìm thấy tập tin 'DSP_Filter_Functions_Help.htm', mô tả các hàm DSP liên quan đến lọc tín hiệu. Bạn có thể thấy rằng giá trị trả về của hàm FIR là một con trỏ đến mảng dữ liệu đích.

Hơn nữa, hàm FIRDelayInit() cần đối số là một con trỏ đến một cấu trúc có kiểu FIRStruct. Code của bạn đã truyền một con trỏ đến một mảng có 2 phần tử, do đó có thể có những hành vi không lường trước được.

Thân,

npbaoduy
15-11-2009, 12:46 AM
Em không hiểu lắm về khai báo một bộ lọc FIR
extern fractional* FIR (
int numSamps,
fractional* dstSamps,
fractional* srcSamps,
FIRStruct* filter
);
cái này là khai báo bộ lọc FIR, trong đó có FIRStruct* filter em không biết cách khai báo thế nào
typedef struct {
int numCoeffs;
fractional* coeffsBase;
fractional* coeffsEnd;
int coeffsPage;
fractional* delayBase;
fractional* delayEnd;
fractional* delay;
} FIRStruct;
Trong file DSP_Filter_Functions_Help.htm có giải thích về các thông số như sau:
numCoeffs: number of coefficients in filter (also M)
coeffsBase: base address for filter coefficients (also h)
coeffsEnd: end address for filter coefficients
coeffsPage: coefficients buffer page number
delayBase: base address for delay buffer
delayEnd: end address for delay buffer
delay: current value of delay pointer (also d)
Trong đó 2 thông số đầu em có thể hiểu, như 5 thông số còn lại em không hiểu là cái gì?
Ví dụ em muốn thiết kế bộ lọc FIR với ngõ vào là mảng x[], ngỏ ra lưu vào mảng y[], các hệ số h lưu trong mảng h[], thì cụ thể em phải khai báo và viết code như thế nào?
Hơn nữa, trong file C:/Program Files/Microchip/MPLAB C30/docs/dsp_lib//DSP Library.htm có ghi là "Building an application which utilizes the DSP Library requires only two files: dsp.h and libdsp-omf.a.", em chỉ tìm thấy file dsp.h, còn không biết file libdsp-omf.a nằm ở đâu cả?
Em xin cám ơn