想要在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] 的圖形變化趨勢, 以便更好的觀察其變化。