算法
文章平均质量分 52
算法层面的博客,与具体何种语言无关
FPGA硅农
数字IC设计,FPGA开发
展开
-
频域抽取FFT(DIF-FFT)的C语言实现
此处以基2频域抽取FFT为例,讲述频域抽取FFT的原理。假设FFT的长度为N2m,我们将序列xXkn0∑N/2−1xnWNnknN/2∑N−1xnWNnknnN/2Xkn0∑N/2−1xnWNnkn0∑N/2−1xnN/2WNknN/2由于WNknN/2WNkn⋅WNN/2−WNnkXk。原创 2023-04-23 13:28:15 · 1714 阅读 · 0 评论 -
xilinx hls实现sobel检测
hls实现sobel边缘检测原创 2022-12-05 13:02:42 · 1129 阅读 · 0 评论 -
C++实现彩色bmp图片转灰度图
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。原创 2022-12-02 14:47:56 · 2406 阅读 · 0 评论 -
Vivado HLS INT8/9乘法优化
在HLS设计中,有时候1个DSP往往可以计算两个INT8或者INT9乘法,下面是一个DSP计算两个INT9乘法的代码实现:设计文件头文件测试文件结果综合后结果可以看到,我们的的确确实现了1个DSP计算两个INT9乘法的效果(必须有一个乘数是共享的)......原创 2022-06-06 15:15:58 · 755 阅读 · 0 评论 -
线段和四边形的交点计算
线段和四边形的交点计算,可以转化为线段和四边形的四条边各自进行交点计算,而线段和线段交点计算的原理已经在之前的一篇博客中介绍过了,这里不再赘述。为了加快速度,在计算和四条边的交点之前,我们先进行一个快速排斥实验,即判断线段的最小包围盒是否和四边形的最小包围盒相交,若不相交,则无需再进行交点的计算,可节省下相等一部分的计算量。以下是python代码实现:import geopandasfrom shapely import geometryimport operatorimport matplot原创 2022-02-15 20:31:01 · 46 阅读 · 1 评论 -
两条线段的交点的计算
问题已知线段P1P2和Q1Q2,判断它们是否有交点,若有,求出交点。1.判断线段是否相交如图,判断线段是否相交,可以通过一系列实验来进行。快速排斥实验若以P1P2和Q1Q2为对角线的矩形不相交,则P1P2肯定不相交即min(p1.x,p2.x) <= max(q1.x,q2.x)min(q1.x,q2.x) <= max(p1.x,p2.x)min(p1.y,p2.y) <= max(q1.y,q2.y)min(q1.y,q2.y) <= max(p1.y,p2原创 2022-02-15 18:57:00 · 2216 阅读 · 0 评论 -
【图像处理】sobel边缘检测的实现
python实现的sobel边缘检测原创 2022-02-11 13:50:33 · 4512 阅读 · 0 评论 -
Yolo4-Tiny代码解读
本文参考代码链接代码yolo4-tiny的整体结构,如下图所示从图中可以看到,yolo4 tiny大致可以分为以下几个模块:1.CSPDarknet53-tiny,是整个网络的backbone2.FPN3.yolo head下面分别作一介绍:CSPDarknet53 tiny由3个BasicConv块和3个Resblock_body块构成。BasicConv比较简单,其实就是一个卷积+BN+LeakyReLU的结构,代码如下所示:class BasicConv(nn.Module):原创 2022-01-19 20:34:34 · 8524 阅读 · 4 评论 -
CRC循环冗余校验码的C语言实现
CRC原理计算方式如下图所示,若除数为n位,待校验的数据为k位,则现在待校验的数据后面添加n-1个0,然后再和除数进行模2除法,所谓模2除法,其实就是将竖式运算中的减法改为异或运算。C代码实现#include <iostream>#include<stdio.h>using namespace std;int P[4]={1,0,1,1};void XOR(int a[4],int b[4]){ for(int i=0;i<4;i++).原创 2021-12-23 14:12:55 · 2381 阅读 · 0 评论 -
【深度强化学习】DDPG算法
算法描述DDPG算法共有4个网络,两个策略网络μ\muμ和μ′\mu^{'}μ′,它们可以根据输入状态确定地输出动作,额外加上一个噪声NtN_tNt;两个critic网络Q和Q′Q和Q^{'}Q和Q′,它们可以根据输入向量[s,a],输出相应的Q值。同时,和DQN一样,DDPG中也引入了experience buffer的机制,用于存储agent与环境交互的数据(st,at,rt,st+1,done)(s_t,a_t,r_t,s_{t+1},done)(st,at,rt,st+1,done),原创 2021-12-16 19:58:23 · 2730 阅读 · 1 评论 -
【深度强化学习】Actor-Critic算法
Actor-Critic算法回顾策略梯度算法:Actor-Critic算法的区别就是对R(τn)R(\tau^n)R(τn)进行了修改。当R(τn)R(\tau^n)R(τn)具有上述三种形式时,便是经典的AC算法,在AC算法,我们通过另一个叫做Critic的神经网络来估计Vπ(st)V^{\pi}(s_{t})Vπ(st)(或其他,视具体情况而定)。本博客实现的便是基于TD残差的AC算法,其策略网络的梯度如下图所示相应的Actor和Critic损失函数为:这里ei=rtn+Vπ(st原创 2021-12-16 16:57:16 · 2630 阅读 · 0 评论 -
【深度强化学习】Policy Gradient算法
Policy Gradient算法TrajectoryTrajectory表示一个回合的状态-动作序列,记为τ\tauτ,其发生的概率记为pθ(τ)p_{\theta}(\tau)pθ(τ),计算公式如上图所示。Policy Gradient我们希望通过最大化下图中的Expected Reward,来进行策略的学习。其梯度计算如下:因此我们可以设计下图所示的损失函数,其中θ\thetaθ为策略神经网络的参数,其输出为每个动作的概率值改进一考虑到R(τn)R(\tau^n)R(τn)原创 2021-12-16 13:08:07 · 1847 阅读 · 0 评论 -
【深度强化学习】DQN
算法描述中文描述代码# -*- coding: utf-8 -*-# import the necessary packagesimport torchimport torch.nn as nnfrom torch.autograd import Variableimport torch.nn.functional as Fimport numpy as npimport gym# 1. Define some Hyper ParametersBATCH_SIZE = 32原创 2021-12-15 21:40:52 · 1290 阅读 · 0 评论 -
【强化学习】Sarsa(Lamda)算法
算法描述代码实现import numpy as npimport pandas as pdimport timeN_STATES = 25 # the length of the 2 dimensional worldACTIONS = ['left', 'right','up','down'] # available actionsEPSILON = 0.7 # greedy policeALPHA = 0.8 # learning rateGAMMA = 0原创 2021-12-15 18:54:12 · 189 阅读 · 0 评论 -
【强化学习】Sarsa算法
Sarsa算法对比 Sarsa 和 Q-learning 算法,可以参见链接代码import numpy as npimport pandas as pdimport timeN_STATES = 25 # the length of the 2 dimensional worldACTIONS = ['left', 'right','up','down'] # available actionsEPSILON = 0.7 # greedy policeALPHA =原创 2021-12-15 16:51:18 · 866 阅读 · 0 评论 -
【强化学习】之Q-Learning
问题描述如图所示,从左上角出发,每次只能往上下左右四个方向移动1个单位,要求设计一个路径,尽可能避免红色障碍,到达蓝色方格处。首先,我们将问题抽象化,25个方格位置分别编号为0-24,表示25个状态,上、下、左、右为四个动作,如下图所示:奖赏机制def get_init_feedback_table(S,a): tab=np.ones((25,4)) tab[8][1]=-10;tab[4][3]=-10;tab[14][2]=-10 tab[11][1]=-10;tab原创 2021-12-15 14:47:05 · 594 阅读 · 0 评论 -
Visio如何画箭头
在使用visio作图时,经常忘记如何画箭头,因此在此做一个记录1.visio中没有直接的箭头选项,因此我们首先点击指针工具–>线条2.按照如图所示连接两个几何体3.选中线条–>箭头,即可将直线变成带箭头的线段...原创 2021-11-19 18:00:01 · 36789 阅读 · 0 评论 -
【数字图像处理】频域低通滤波
代码思想:将图像进行FFT变换后,把DC分量移到图像中心,然后截取中间HxW的小矩阵(低频分量)import torchimport torch.fftimport torch.nn.functional as Fimport matplotlib.pyplot as pltimport numpy as npfrom PIL import Imageimport torch.nn as nnclass SpectralPooling(nn.Module): def __init原创 2021-11-16 16:09:39 · 1330 阅读 · 0 评论 -
Pytorch--自己动手实现模型剪枝
pytorch剪枝尽管Pytorch自带了剪枝的工具,但是其在灵活性上终究敌不过自己手写的剪枝代码,以下就是博主模型剪枝的一次简单尝试。代码:import torch.nn as nnimport torchimport torch.nn.functional as Ffrom torch import optimfrom torchvision import datasets,transformsfrom torch.utils.data import DataLoaderdevice原创 2021-07-15 01:05:24 · 6014 阅读 · 9 评论 -
FFT实现卷积运算
2D卷积的实现:import numpy as npdef fft_conv(x,weight,padding,stride): x_padded=np.pad(x,((padding,padding),(padding,padding))) h_pad,w_pad=x_padded.shape kx,ky=weight.shape weight_padded=np.pad(weight,((0,h_pad-kx),(0,w_pad-ky))) x_ffted=n原创 2021-07-14 09:29:40 · 2135 阅读 · 3 评论 -
多边形向内收缩指定距离的实现
import mathimport numpy as npdef calc_cos_angle(a,b): #计算两个向量的夹角余弦 inner_ab=a[0]*b[0]+a[1]*b[1] abs_a=math.sqrt(a[0]**2+a[1]**2) abs_b=math.sqrt(b[0]**2+b[1]**2) return inner_ab/(abs_a*abs_b)def calc_point(p1,p2,p3,d):原创 2021-07-07 00:28:59 · 1055 阅读 · 1 评论 -
geopandas拓扑检查(任意两个几何体不相交)
之前使用rtree来进行拓扑检查,主要是使用GeoDataFrame的sindex来实现的,但是由于某种未知的原因,rtree总是会莫名奇妙的运行错误,且没有任何错误提示,因此博主自己实现了一版拓扑检查,思想和之前其实差不多:先得到所有几何体的外接矩形框,然后根据外接矩形框判断是否有可能相交(矩形框相交,几何体才有相交的可能性),通过外接矩形框的筛选之后,再对可能相交的几何体进行一个精确的相交判断,代码实现如下:import geopandasimport copyimport matplotlib.原创 2021-06-23 23:26:00 · 1196 阅读 · 0 评论 -
启发式算法(蒙特卡洛算法和差分进化算法)解决设计空间搜索问题
要求解的问题python代码import numpy as npimport randomK=3S=1N=64M=128R=32C=32PE=220 #DSP数量B=50000 #片上存储器容量def objfunc(Tn,Tm,Tr,Tc): Tload=max(Tn*(S*Tr+K-S)*(S*Tc+K-S),Tn*Tm*K*K) Tstore=Tr*Tc*Tm Tco原创 2021-06-11 14:55:18 · 505 阅读 · 0 评论 -
2D FFT、RFFT的C语言实现
#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define N 8#define STAGE ((int)(log(N)/log(2)))using namespace std;typedef complex<double> data_t;void FFT(data_t Xin[N],data_t Xout[N]){ //旋转因子原创 2021-05-31 23:54:31 · 1903 阅读 · 7 评论 -
C语言实现FFT(非递归蝶形运算版)
蝶形算法可参考链接代码如下:#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define N 32#define STAGE ((int)(log(N)/log(2)))using namespace std;typedef complex<double> data_t;void FFT(data_t Xin[N],data_t Xout[N]原创 2021-05-28 21:41:18 · 1387 阅读 · 0 评论 -
C语言实现FFT(递归版)
#include<iostream>#include<complex.h>#include<math.h>#define PI 3.14159#define FFT_LENGTH 16using namespace std;void FFT(complex<double>* Xin,complex<double> *Xout,int N){ if(N<2) Xout[0]=Xin[0]; els原创 2021-05-28 20:31:33 · 788 阅读 · 0 评论 -
FFT快速傅里叶变换推导
DFT的定义DFT,即离散傅里叶变换,假设我们有长为N的序列x[0],x[1],…,x[N-1],那么DFT计算过程如下X[k]=∑n=0N−1x[n]WNnk,(WNnk=e−j2πN)X[k]=\sum_{n=0}^{N-1}x[n]W_N^{nk},(W_N^{nk}=e^{-j\frac{2\pi}{N}})X[k]=∑n=0N−1x[n]WNnk,(WNnk=e−jN2π)而IDFT(离散傅里叶逆变换)计算过程为x[k]=∑n=0N−1X[n]WN−nkx[k]=\sum_{n=0原创 2021-05-18 21:58:22 · 505 阅读 · 0 评论 -
Winograd算法的python实现
算法介绍F(m∗m,r∗r)F(m*m,r*r)F(m∗m,r∗r):一个(m+r−1)∗(m+r−1)(m+r-1)*(m+r-1)(m+r−1)∗(m+r−1)的输入特征图和一个r∗rr*rr∗r的卷积核进行2d卷积得到m∗mm*mm∗m的输出,若采用直接卷积,则需要m2r2m^2r^2m2r2个乘法,而若采用winograd算法,则乘法数量减少为(m+r−1)∗(m+r−1)(m+r-1)*(m+r-1)(m+r−1)∗(m+r−1),具体计算过程如下:其中,g为r∗rr*rr∗r的卷积核,d原创 2021-05-09 13:02:56 · 1410 阅读 · 5 评论 -
基于c++的int8量化推理
训练代码:from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.nn import initfrom torch.nn.parameter import Parameterfrom t原创 2021-02-18 11:43:25 · 1096 阅读 · 3 评论 -
卷积运算的im2col实现
#include <stdio.h>#include <windows.h>#include<iostream>using namespace std;typedef double dtype;void kernel_reshape(dtype* weight_in,dtype* weight_out,int K,int C,int N) //N*K*K*C->(K*K*C)*N{ for(int i=0;i<N;i++)原创 2021-02-10 23:40:51 · 756 阅读 · 0 评论 -
基于KL散度的INT8训练后量化
我们知道,P,Q两列数据的相对熵越小,那么P,Q分布越接近,用Q近似P损失的信息就少,英伟达的INT8量化就是基于这个原理,下面是量化过程相对熵的计算。(未完,打算复现这个int8量化)import mathimport numpy as npimport matplotlib.pyplot as pltdef create_bin(data,num): #将[data.min,data.max] num等分,统计每个子区间内的数据个数 data_max=max(data)原创 2020-11-08 12:58:32 · 3118 阅读 · 1 评论 -
谷歌TPU分析之脉动阵列
在之前的博客中,介绍了一种使用脉动阵列计算矩阵乘法的方法,在那篇博客中,脉动阵列的主要特点是:数据从左向右流动,而权重则从上向下流动。而在谷歌第一代的TPU中,其脉动阵列却并非是这种形式的。在谷歌的TPU中,权重是预先存储在Px∗PyP_x*P_yPx∗Py个PE上的,并且整个计算过程权重都保持不动,即weight stationary,而数据自左向右流动,同时,每个PE单元的部分和则自上而下流动,下面是一个具体的计算过程演示:...原创 2020-11-06 21:43:27 · 1432 阅读 · 0 评论 -
素数的测定
强伪素数的定义,如下:则容易知道,满足条件的n有可能是素数也有可能是合数(强伪素数),但是不满足条件的一定是合数。我们又有以下定理所以当返回为真时,它为合数错误的概率小于1/4,当返回为假时,必为合数,那么重复调用k次返回为真时,该数为合数的概率应该小于14k\dfrac{1}{4^k}4k1,只要k取10,错误概率就小于百万分之一。整个代码如下:#include<iostream>#include<cstdlib>#include<ctime>#in原创 2020-11-02 20:45:18 · 305 阅读 · 0 评论 -
矩阵乘法脉动阵列的C++模拟
自从谷歌的TPU问世以后,被人们遗忘很久的脉动阵列又再次火了一把。矩阵乘法就可以用脉动阵列进行计算,而脉动阵列这种数据流又特别适合用硬件进行实现。下面是用脉动阵列进行矩阵乘法的示意图。可以看到,A的每一行不是同时进入脉动阵列的,而B的每一列也不是同时进入脉动阵列的,相邻行或列进入脉动阵列的时间恰好相差一个时钟周期。以下是用c++模拟脉动阵列的代码:#include <iostream>#include <cstdlib>#include <ctime>原创 2020-10-30 20:57:13 · 1133 阅读 · 1 评论 -
ShiDianNao的c++实现
#include"cfg.h"#include<iostream>#include<cstdlib>#include<ctime>using namespace std;class PE{public: int weight; int feature; int acc;public: void calc(){ acc+=weight*feature; return; }};class原创 2020-10-27 11:01:29 · 269 阅读 · 0 评论 -
循环分块对减少off-chip memory access的具体分析
如图,我们要计算NaN_aNa个t(i)t(i)t(i)和NbN_bNb个r(j)r(j)r(j)两两之间的距离,这是未进行分块的原始代码,假设cache(或者片上缓存)的容量为M个向量,并假设NaN_aNa和NbN_bNb远大于MMM,则对每个i,我们从片外存储器load一个ttt,并且从片外存储器load M-1个rrr,进行M-1次的距离计算后,这M-1个r便被替换出cache,转而加载下一组M-1个的r,因此,对每个确定的i,需要进行约[NbM−1][\dfrac{N_b}{M-1}][M.原创 2020-10-22 21:22:10 · 443 阅读 · 0 评论 -
N皇后问题的拉斯维加斯算法和回溯算法
#include<iostream>#include<cstdlib>#include<ctime>#define N 8using namespace std;int T[100]; //(i,T[i])指放在第i行第T[i]�?int k=0; //当前已经放置了多少行bool place(int j);void backtrace(){ //当前已经放置完第1,2,3...k行,从第k+1行开始回�?原创 2020-10-22 15:50:40 · 1110 阅读 · 0 评论 -
EIE稀疏矩阵乘法硬件模拟
#include<iostream>#include<cstdlib>#include<ctime>#include <iomanip>using namespace std;typedef int dtype;typedef struct CSC{ int a; //存储非零元素个数 int n; //存储列数 dtype* v; //存储非零值原创 2020-10-19 16:17:38 · 376 阅读 · 0 评论 -
稀疏矩阵CSR存储的C++实现
实现了稀疏矩阵的生成(指定稀疏程度)、稀疏矩阵转换为CSR、从CSR中恢复出矩阵、稀疏矩阵和向量的乘法等功能。从运行结果来看,稀疏矩阵存储为CSR格式和向量相乘的运行速度快于普通矩阵向量乘法,而且稀疏程度越高,优势越明显。#include<iostream>#include<cstdlib>#include<ctime>#include<stdio.h>typedef int dtype;using namespace std;void csr_原创 2020-10-16 20:53:11 · 4700 阅读 · 2 评论 -
生成不重复的随机数
问题:生成[0,N-1]区间内的n个互不相同的随机数。解决思路:首先,生成一个长度为N的数组,然后将其打乱,取前n个数,即为上述问题的解。为了验证上述方法产生的随机数是符合要求的,我们用下面的方法来检验。每次随机的从[0,N-1]中选取n个数,记它们的和为X,则X的期望可以计算如下:这样选取n个数总共有CNnC_N^nCNn中取法,这么多取法总共取出了CNn∗nC_N^n*nCNn∗n个数,而0,1,2,…N-1这N个数出现的概率是相同的,因此每个数出现了n∗CNnN\dfrac{n*C_N^n原创 2020-10-07 21:38:02 · 1073 阅读 · 0 评论