匯編語言完成convolution

想要在arm匯編語言的環境下(keils),使用arm7tdmi或者cortex-m4去完成單行矩陣的convolution.
• x[n]:
• [3, -5, 6, -7, 68, -73, 25, -31, 17, 8, -4, 2]
• h[n]:
• [9, -6, 77, -43, 25, -85, 21, -6, 5]
并且圖表上展現出x[n],h[n],h[-n],y[n]的圖形變化趨勢

望采纳!点击回答右侧采纳即可采纳!!!

大概步骤:1.定义输入数组[n]和h[n],将它们初始化为题目中给出的数据。
2.定义输出数组y[n].
3.定义两个指针变量i和j,用于指向x[n]和h[n]数组中的元素。
4.使用循环语句,对于[n]中的每个元素,计算y[]中对应的值。具体方法是:
·使用双重循环,遍历h[n]中的每个元素。
·对于每个h[n]中的元素,计算y[n]中对应的值。具体方法是:y[n]+=[]*h[j]。
·将和j的值同时减1。
5.使用图表工具将x[n]、h[n]、h[-n]和yn]的变化趋势绘制出来。
代码:


```bash
; 定义 x[n] 和 h[n] 数组
x_array: .word 3, -5, 6, -7, 68, -73, 25, -31, 17, 8, -4, 2
h_array: .word 9, -6, 77, -43, 25, -85, 21, -6, 5

; 定义 y[n] 数组
y_array: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

; 定义循环计数器 i 和 j
i = 0
j = 0

; 定义循环计数器上限 M 和 N
M = 12
N = 9

; 进入循环
loop:

; 计算 y[n] 的值
ldr r1, [x_array, i, lsl #2] ; 加载 x[n] 的元素
ldr r2, [h_array, j, lsl #2] ; 加载 h[n] 的元素
mul r1, r1, r2 ; 乘法运算
ldr r2, [y_array, i, lsl #2] ; 加载 y[n] 的元素
add r1, r1, r2 ; 加法运算
str r1, [y_array, i, lsl #2] ; 存储 y[n] 的元素

; 更新 i 和 j 的值
sub i, i, #1
sub j, j, #1

; 判断是否退出循环
cmp i, M
bge end_loop
cmp j, N
bge end_loop

; 继续循环
b loop

; 退出循环
end_loop:

; 使用图表工具显示 x[n]、h[n]、h[-n] 和 y[n] 的变化趋势

```

参考大神的文章,汇编实现矩阵的convolution。请采纳哦!!!!!!!!!!!!!!!!!!

DATA_SIZE     EQU 6
KERNEL_SIZE EQU 3
OUTPUT_SIZE EQU 4

    AREA DEMO, CODE, READONLY
    ENTRY

START
    MOV r4, #0                    ; row of data, i
    MOV r13, #2000                ; initialize the stack size
    
    LDR r8, =DATA                ; r8, address of data
    LDR r9, =KERNEL                ; r9, address of kernel
    LDR r10, =OUTPUT            ; r10, address of output

FOR_ROW
    MOV r5, #0                    ; column of data, j

FOR_COLUMN
    MOV r6, #0                    ; row of kernel, k

GET_KERNEL_ROW
    MOV r7, #0                    ; column of kernel, l

GET_SUM
    ; Get the data
    ADD r11, r4, r6                ; r11 = i + k
    MOV r12, #DATA_SIZE
    MUL r11, r12, r11            ; r11 = (i + k) * 6
    ADD r11, r11, r5            ; r11 = (i + k) * 6 + j
    ADD r11, r11, r7            ; r11 = (i + k) * 6 + j + l
    MOV r12, #4
    MUL r11, r12, r11            ; *4
    LDR r11, [r8, r11]            ; data in r11
    PUSH {r11}                    ; push data to stack
    
    ; Get the kernel
    MOV r12, #KERNEL_SIZE
    MUL r12, r6, r12            ; r12 = k*3
    ADD r12, r12, r7            ; r12 = k*3 + l
    MOV r11, #4
    MUL r12, r11, r12
    LDR r12, [r9, r12]            ; get the kernel
    
    POP {r11}
    MUL r12, r11, r12            ; r12 = kernel * data
    PUSH {r12}                    ; push the result to stack
    
    ; Calculate the result
    MOV r11, #4
    MUL r12, r4, r11            ; r12 = i * 4
    ADD r12, r12, r5            ; r12 = (i * 4) + j
    MUL r12, r11, r12            ; get the offset
        
    LDR r11, [r10, r12]
    POP {r12}
    ADD r12, r11, r12            ; sum += result
    PUSH {r12}
    
    MOV r11, #4
    MUL r12, r4, r11            ; r12 = i * 4
    ADD r12, r12, r5            ; r12 = (i * 4) + j
    MUL r12, r11, r12            ; get the offset again
    
    ; Store the result
    POP {r11}
    STR r11, [r10, r12]
    
    ADD r7, r7, #1
    CMP r7, #KERNEL_SIZE
    BMI GET_SUM
    
    ADD r6, r6, #1
    CMP r6, #KERNEL_SIZE
    BMI GET_KERNEL_ROW
    
    ADD r5, r5, #1
    CMP r5, #OUTPUT_SIZE
    BMI FOR_COLUMN
    
    ADD r4, r4, #1
    CMP r4, #OUTPUT_SIZE
    BMI FOR_ROW

DATA    DCD 0x23, 0x25, 0x27, 0x85, 0x86, 0x87
        DCD 0x33, 0x35, 0x35, 0x95, 0x95, 0x98
        DCD 0x44, 0x45, 0x44, 0xA5, 0xA6, 0xA7
        DCD 0xD5, 0xD6, 0xD7, 0x68, 0x69, 0x7A
        DCD 0xFD, 0xFF, 0xFE, 0x42, 0x43, 0x43
        DCD 0xEA, 0xEB, 0xEC, 0x55, 0x56, 0x56

KERNEL     DCD 1, 2, 1
        DCD 0, 0, 0
        DCD -1, -2, -1

OUTPUT     DCD 0, 0, 0, 0
        DCD 0, 0, 0, 0
        DCD 0, 0, 0, 0
        DCD 0, 0, 0, 0

    END    



大神文章地址:https://blog.csdn.net/weixin_46422143/article/details/127350071

clc
clear
x=[0,0,0,0,0,0,0,0,1];
h=[1,0,-1,0,0,0,0,0,0];
y=conv(x,h);
figure(1);
stem(linspace(0,length(x)-1,length(x)),x)
figure(2);
stem(linspace(0,length(h)-1,length(h)),h)
figure(3); 
stem(linspace(0,length(y)-1,length(y)),y)

在實現卷積運算時, 使用的算法通常有兩種: 暴力算法和快速卷積算法 (Fast Convolution Algorithm), 前者計算簡單但效率較低, 後者雖然計算較為複雜但效率較高。
實現完成之後, 您可以利用圖表展示工具繪製出 x[n], h[n], h[-n], y[n] 的圖形變化趨勢, 以便更好的觀察其變化。