K
						
					
					
						
					
				
				
					Raw Denoise
The RAWDNS module implements image denoising on the raw domain.The the NLMs(Non-local Means) algorithm based on block matching is used for denoising.
Parameter
typedef struct{
    uint6   sigma;    //range[0-63]
    uint1   eb;       //{0,1}
    uint7   Filterpara; //range[0-127]
    uint12  invksigma2; //1/ksigma2 <<12
}rawdns_register;
Param sigma and Filterpara jointly control the intensity of the filtering.Param invksigma2 is the quantized reciprocal of the product of sigma and Filterpara。
Input  & Ouput
typedef stream_u12 Stream_t;//input raw data
typedef stream_u12 Stream_t;//output rgb data
Resources
The algorithm uses a 11x11 window to complete the denoising process, and the storage resources are listed as follows
uint12 rawdns_lines[10][8192];//10x8192 sram
uint12 rawdns_block[11][11];// 11x11 registers
Algorithm
Function rawdns_process describes the block matching based NLM algorithm, and the main calculation process is the following loop.
for(k=1;k<=9;k+=2){
    for(l=1;l<=9;l+=2){
        if((k!=5) || (l!=5))
        {
            eur_distance = Cal_Eur_Distance(rawdns_block,k,l);
            diff = rawdns_max(eur_distance, sigma2);
            weight = Cal_weight(diff,rawdns_reg ,ksigma2);
            if(weight > max_weight)
            {
                max_weight = weight;
            }
            total_weight += weight;
            total_value += weight * rawdns_block[k][l];
           }
        }
    }
The Cal_Eur_Distance function calculates the Euclidean distance between different blocks, and cal_weight calculates the Gaussian weights of different pixels.Finally, according to the calculation result, the pixel value after denoising(usually center pixel of the window) is output.
if(total_weight == 0)
    return rawdns_block[5][5];
else
    return rawdns_clip(total_value/total_weight);