Tên hàm thực thi Số lần gọi hàm Thời gian (%)
L40_mac 18109111 21.28 L_mac 69517406 19.36 L_hsl 14839245 10.17 L_mult 16685416 4.06 L_v_inner 187816 3.61 Iir_2nd_s 20168 2.64 L_40_shl 423407 2.43 Shr 7950898 2.27
3.6.2. Tối ưu hóa thuật tốn (Optimization of algorithm)
Mục tiêu chính của việc tối ưu hóa thuật tốn là đơn giản hóa mà khơng làm giảm chất lượng giọng nói. Để tối ưu hóa logic của thuật toán mã, các phương pháp phổ biến nhất bao gồm thuật toán tái cấu trúc, sửa đổi thứ tự của mã và loại bỏ tính tốn thừa.
1) Cấu trúc lại bộ lọc IIR: Trong thuật tốn của MELPe, quy trình của bộ mã hóa bao gồm mơ-đun tính tốn đỉnh dư (residual peak calculation module) và sửa đổi mô-đun cường độ giọng nói băng thơng (modification of bandpass speech strength module). Hai mô-đun này được gọi là bộ lọc IIR bậc hai (hàm “iir_2nd_s”) nhiều lần. Bên trong hàm, có một lệnh lặp "for" gọi hàm "L_mult" và hàm "L_mac". Các hàm này bao gồm nhân, chuyển và cộng. Câu lệnh shift có thể được đưa ra khỏi vòng lặp
và được thực thi ở cuối vịng lặp. Điều này khơng thay đổi kết quả, nhưng đơn giản hóa tính tốn.
2) Đơn giản hóa câu lệnh lựa chọn: Để đáp ứng nhu cầu của nhiều loại lệnh gọi
khác nhau, một số hàm đang sử dụng rất nhiều cấu trúc if-else. Hạn chế là các mã này có thể tiêu tốn một lượng lớn thời gian thực hiện trong các lệnh phán quyết và nhảy. Do đó các hàm này phải được tối ưu hóa từ cấu trúc bằng cách được viết lại dựa trên tần suất của lệnh rẽ nhánh.
3.6.3. Tối ưu hóa mã (Optimization of code)
Mã nguồn MELPe tiêu chuẩn được viết bằng ANSI-C, sử dụng thiết kế mô- đun để đảm bảo khả năng đọc tốt. Nhưng điều đó cũng làm tăng số lượng lệnh gọi hàm, làm giảm hiệu quả. Theo quy tắc 2/8 tức là 80% thời gian chạy được sử dụng trong 20% mã, để tối ưu hóa hiệu quả hơn, trọng tâm của việc tối ưu hóa là nhằm vào 20% mã chạy chính. Phong cách mã hóa C nên được thay đổi để phù hợp với các đặc điểm của kiến trúc và trình biên dịch ARM.
1) Tối ưu hóa các lệnh cơ bản: Tệp “mathhalf.c” chứa rất nhiều hàm thực hiện
các phép toán số học nguyên thủy. Nhiều trong số chúng là các phép toán cơ bản, chẳng hạn như nhân và tích lũy 32 bit (hàm “L _ mac”) hoặc phép cộng 32 bit bão hịa (hàm “L_add”), có thể được thực hiện bằng lệnh Extended ARM của như SMLAL và QDADD. Sử dụng các hướng dẫn đặc biệt này có thể lưu các instructions một cách hiệu quả.
2) Hàm nội tuyến (Inline function): Việc thêm tiền tố nội tuyến vào hàm có thể
loại bỏ thời gian gọi hàm, vốn tiêu tốn nhiều thời gian. Hàm nội tuyến đang thay thế trình gọi bằng mã nguồn của hàm, điều này sẽ làm tăng kích thước mã, cụ thể là trao đổi khơng gian lấy thời gian. Do đó, chỉ có hàm với dung lượng mã nhỏ là thích hợp để sử dụng hàm nội tuyến.
Theo bảng trên, các hàm được sử dụng thường xuyên nhất là “L40_mac”, “L_mac”, “L_shl”, “L_mult”, tác động của kích thước khơng gian lưu trữ là rất nhỏ,