单片机作业1_为OLED制作汉字字库_第4部分

这篇博客主要介绍了如何使用高通字库制作汉字字库,特别是针对GB2312字符,通过C语言进行文件操作,将字形码分割并写入AT25F4096芯片,以便在OLED显示。内容包括区位码解析、文件处理技巧,如创建、打开、定位、读取和关闭文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本部分2个工作:
① 向 AT25F4096 写入部分 HZK8x16 转化后的 “列行式” 数据
② 解码 GB2312 字符,根据码值,去 AT25F4096 中寻找对应的点阵数据,然后送入 OLED 显示

1 看看别人的字库怎么做的

1.1 高通字库

先看看别人怎么做的:这方面的龙头大哥——“高通字库”
http://www.gaotongfont.cn/index.html

在这里插入图片描述

利用“高通字库”生成个超级大的“列行式”点阵数据数组:
在这里插入图片描述
在这里插入图片描述

总计
216576 32 = 6768 \frac{216576}{32} = 6768 32216576=6768
问题:不是说 6763 个汉字吗?为啥这里算出来是 6768 个呢?多出来 5 个在哪里 ?
:在 55 区有 5 个空位

在这里插入图片描述

在这里插入图片描述

1.2 GB2312 部分区位码

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.3 C语言文件操作

用“高通字库”软件,生成了GB2312字库的点阵字形码,将这些字形码按照区生成一个个小文件,方便使用。考验“文件操作”功底的时候到了!!!
在这里插入图片描述

1.3.1 生成每个区的字形码

因为“高通字库”软件生成的原始数组太大了,系统处理不了这么大的数组,只能 “分成两半” 处理,定义偏移量 OFFSET == 16,汉字从16区开始,然后到 55 区时,(手动更改 OFFSET = 55) 再分割一次,劈成两半,系统就能够处理了!每次处理时,不用的另一半注释掉!!!
① 16 ~ 54 第一部分
② 55 ~ 87 第二部分在这里插入图片描述

#define OFFSET	16
void generateRegionCode(int region){
   
	if(region < OFFSET){
   
		return;
	}
	char buf[64] = "./Font16_16/region_";
	sprintf(buf, "%s%d", buf, region);
	strcat(buf, ".c");
	// puts(buf);

	FILE *pf = fopen(buf, "w");
	if(pf == NULL){
   
		perror("file open failed:");
		return;
	}
	sprintf(buf, "const unsigned char region_%d_dat[%d] = {\n", region, 94 * 32);
	fputs(buf, pf);
	for(int n = 0; n < 94; n++){
   
		fprintf
非常抱歉,我之前提供的代码存在错误。在 PyTorch 中,并没有直接提供离散余弦变换(DCT)的函数。对于 DCT 的实现,你可以使用 `torch.rfft` 函数结合 DCT 系数矩阵来进行计算。 下面是一个修正后的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim # 定义离散余弦变换(DCT)系数矩阵 dct_matrix = torch.zeros(256, 256) for i in range(256): for j in range(256): dct_matrix[i, j] = torch.cos((2 * i + 1) * j * 3.14159 / (2 * 256)) # 定义 OMP 算法 def omp(A, y, k): m, n = A.shape x = torch.zeros(n, 1) residual = y.clone() support = [] for _ in range(k): projections = torch.abs(A.t().matmul(residual)) index = torch.argmax(projections) support.append(index) AtA_inv = torch.linalg.inv(A[:, support].t().matmul(A[:, support])) x_new = AtA_inv.matmul(A[:, support].t()).matmul(y) residual = y - A[:, support].matmul(x_new) x[support] = x_new return x # 加载原始图像 image = torch.randn(256, 256) # 压缩感知成像 measurement_matrix = torch.fft.fft(torch.eye(256), dim=0).real compressed = measurement_matrix.matmul(image.flatten().unsqueeze(1)) # 使用 OMP 进行重构 reconstructed = omp(dct_matrix, compressed, k=100) # 计算重构误差 mse = nn.MSELoss() reconstruction_error = mse(image, reconstructed.reshape(image.shape)) print("重构误差:", reconstruction_error.item()) ``` 在这个示例中,我们手动定义了 DCT 系数矩阵 `dct_matrix`,然后使用 `torch.fft.fft` 函数计算测量矩阵,并进行实部提取。接下来的步骤与之前的示例相同。 请注意,这只是一个示例,用于演示如何使用自定义的 DCT 系数矩阵进行压缩感知成像。在实际应用中,你可能需要根据具体的需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值