coef_seq.cpp

来自「vhdl source,ver-fir-coefficient,simulink」· C++ 代码 · 共 947 行 · 第 1/2 页

CPP
947
字号
						}
					}
				}
				mcv_coef_length = (num_mac + mcv_reload_zero_insert) * num_cycles;

				if(mcv_reload_zero_insert > 0)
				{
					for( i = 0; i < num_cycles; i++)
					{
						for(j = 0; j < num_mac + mcv_reload_zero_insert ; j++)
						{
							int ini_index = i * (num_mac) + j;
							int new_index = i * (num_mac + mcv_reload_zero_insert) + j;
							if(j < (mem_num-1) * coef_one_mem)
							{
								tmp_coef[new_index] = coef[ini_index];
							}
							else if(j < (mem_num-1) * coef_one_mem + mcv_reload_zero_insert)
							{
								tmp_coef[new_index] = 0;
							}
							else
							{
								tmp_coef[new_index] = coef[ini_index - mcv_reload_zero_insert];
							}
						}
					}
					for (i=0; i<2048; ++i)
					{
						coef[i] = tmp_coef[i] ;
					}
				}
				/**********************************************************************************
				*
				* Reorder For Multi-Rate Coeficient Sets
				*
				**********************************************************************************/
				if(poly_type==INT||poly_type==DEC)
				{
//					length_wr = ceil((double)((double)(coef_length-1.0)/(double)poly_fact));
					length_wr = ceil((double)((double)(coef_length)/(double)poly_fact));
					if(length_wr<3)
					{
							length_wr = 3;
					}

					// Multi-Cycle Variable
					if(struct_type == MCV)
					{
						// Store to temporary array coef_mr[]
						num_mac = ceil((length_wr + 0.0)/(num_cycles+0.0));
						mcv_coef_length = num_mac * num_cycles;
						if(coef_store_type == M512)
						{
							coef_one_mem = (int) floor(18.0/((double) coef_width));
							if(coef_one_mem == 0)
							{
								coef_one_mem = 1;
							}
						}
						else if(coef_store_type == M4K)
						{
							coef_one_mem = (int) floor(36.0/((double) coef_width));
						}
						else
						{
							coef_one_mem = 1;
						}
						mem_num = (int) ceil(((double) num_mac)/ ((double)coef_one_mem));
						mcv_reload_zero_insert = mem_num * coef_one_mem - num_mac;
						if(mem_num == 1)
						{
							mcv_reload_zero_insert = 0;
						}

						for(i=0;i<2048;i++)
						{
							coef_mr[i] = 0;
							coef[i] = 0;
						}
						if(coef_store_type==LC)
						{
							//coef_mr[0] = 0;
							for(i=0;i<poly_fact;i++)
							{
								for(j=0;j<mcv_coef_length;j++)
								{
									ai = i+j*poly_fact;
									bi = j+i*mcv_coef_length;	
									ci = (mcv_coef_length-1-j)+i*mcv_coef_length;	
									if(num_cycles==1)
									{
										//reorder and reverse each set
										coef_mr[ci] = coef_ori[ai];
									}
									else
									{
										// just reorder
									coef_mr[bi] = coef_ori[ai];
									}
								}
							}
							coef_mr[mcv_coef_length*poly_fact] = 0;
							
							for (int iset = 0; iset<poly_fact; ++iset)
							{
								for (j=0; j<num_mac; ++j)
								{
									for (i=0; i<num_cycles; ++i)
									{
										k = i*num_mac + j + iset * mcv_coef_length;
										if (i==0)
										{
											tmp_coef[k] = coef_mr[(num_cycles - 1) * num_mac + j + iset * mcv_coef_length];
										}
										else
										{
											tmp_coef[k] = coef_mr[(i -1 ) * num_mac + j + iset * mcv_coef_length];
										}
									}
								}

								for (j=0; j<num_mac; ++j)
								{
									for (i=0; i<num_cycles; ++i)
									{
										k = i*num_mac + (num_mac - 1 - j) + iset * mcv_coef_length;
										if(coef_store_type == LC)
										{
											coef[j*num_cycles + i + iset * mcv_coef_length] = tmp_coef[k];
										}
									}
								}
							}
							for(i=0;i<2048;i++)
							{
								if(num_cycles>1)
								{
									coef_mr[i] = coef[i];
								}
							}



						}
						else
						{
							for(i=0;i<poly_fact;i++)
							{
								for(j=0;j<length_wr;j++)
								{
									ai = i+j*poly_fact;
									bi = j+i*mcv_coef_length;	
									coef_mr[bi] = coef_ori[ai];
								}
							}

							for(i=0;i<poly_fact;i++)
							{
								mcv_coef_length = (num_mac + mcv_reload_zero_insert) * num_cycles;
								if(mcv_reload_zero_insert > 0)
								{
									for( int i_p = 0; i_p < num_cycles; i_p++)
									{
										for(int j_p = 0; j_p < num_mac + mcv_reload_zero_insert ; j_p++)
										{
											int ini_index = i_p * (num_mac) + j_p + i * num_mac * num_cycles;
											int new_index = i_p * (num_mac + mcv_reload_zero_insert) + j_p + mcv_coef_length * i;
											if(j_p < (mem_num-1) * coef_one_mem)
											{
												tmp_coef[new_index] = coef_mr[ini_index];
											}
											else if(j_p < (mem_num-1) * coef_one_mem + mcv_reload_zero_insert)
											{
												tmp_coef[new_index] = 0;
											}
											else
											{
												tmp_coef[new_index] = coef_mr[ini_index - mcv_reload_zero_insert];
											}
										}
									}
								}
									
							}
							if(mcv_reload_zero_insert > 0)
							{
								for (int i_l=0; i_l<2048; ++i_l)
								{
									coef_mr[i_l] = tmp_coef[i_l] ;
								}
							}
							coef_mr[mcv_coef_length*poly_fact+1] = 0;
						}
						length_wr = mcv_coef_length;
					}
					//Reassign back to array before writing to disk
					for(i=0;i<2048;i++)
					{
						coef[i] = coef_mr[i];
					}
				}
				/*********************************************************************************/
			}
			else
			{
				length_wr = ceil((double)((double)coef_length/(double)poly_fact));
				if(length_wr<3)
				{
					length_wr = 3;
				}
				coef_length_ori = coef_length;
				if(poly_type==INT||poly_type==DEC)
				{
					coef_length = length_wr;
				}
				width_stage[0] = 1;
				width_stage[1] = 2;
				width_stage[2] = 4;
				width_stage[3] = 9;
				width_stage[4] = 18;
				width_stage[5] = 36;

				coef_set_width = ceil(log(num_coef_set)/log(2.0));
				if(sym == 1)
				{
					coef_length = half_len;
				}

				if(coef_store_type == M512)//M512
				{
					width_stage[5] = 0;
					if(coef_set_width<=4)
					{
						width_index_ini = 4;
						group_size_ini = 5 - coef_set_width;
					}
					else
					{
						width_index_ini = 4;
						group_size_ini = 1;
					}
					max_value = (double)pow(2.0,18);
				}
				else
				{
					width_index_ini = 5;
					group_size_ini = 7 - coef_set_width;
					if(coef_set_width<=6)
					{
						group_size_ini = 7 - coef_set_width;
					}
					else
					{
						group_size_ini = 1;
					}
					max_value = (double)pow(2.0,36);
				}

				group_size = group_size_ini;
				if( group_size > coef_length)
				{
					group_size = coef_length;
				}
				else
				{
					width_index = width_index_ini;
					mem_width = coef_bit_width + ceil(log(group_size)/log(2.0));
					if(group_size<length_wr){
						while(mem_width < width_stage[width_index])
						{
							flag =1;
							group_size++;
							width_index --;
							mem_width = coef_bit_width + ceil(log(group_size)/log(2.0));
						}
						if(flag == 1)
						{
							group_size--;
							width_index ++;
							mem_width = coef_bit_width + ceil(log(group_size)/log(2.0));
						}
					}
				}
				num_coef_group = ceil(coef_length /(group_size + 0.0));
			}
			/**********************************************************************************
			 *
			 * Write coeficients to file
			 *
			 **********************************************************************************/

			if(poly_type==INT||poly_type==DEC)
			{
				/**********************************************************************************
				*
				* Write coeficients to file
				* Multi-Rate Filter
				// Maybe creating a 2-D array of coeficients would be a better option
				// run the writer section one phase after another concatenating the ouptut
				// from each run to form the loadable PP set

				*	
				**********************************************************************************/
				out_file.open(out_name, ios::out, filebuf::openprot);
				temp_file.open("c:/cvs/sj/projects/fir_compiler/work/gui/temp/coef_arr.txt", ios::out, filebuf::openprot);
				i = out_file.is_open();
				if (i!=0)
				{
					if(struct_type == MCV)
					{
						out_file <<  coef[0] ;	
						for (i=1; i<poly_fact*length_wr; ++i)
						{
							out_file << "\n"<< coef[i] ;	
						}
					}
					else
					{
						// Initialize 2-D array of coeficients coef_mr_arr[16][2048]
						for(i = 0; i < 16; ++i)
						{
							for (j = 0; j < 128; ++j)
							{	
								coef_mr_arr[j][i] = 0;
							}
						}
						// Generate 2-D array of coeficients coef_mr_arr[phase][j]
						for(i = 0; i < poly_fact; ++i)
						{
							for (j = 0; j < length_wr; ++j)
							{	
								coef_mr_arr[j][i] = coef[j*poly_fact+i];
							}
						}
						for(i = 0; i < poly_fact; ++i)
						{
							for (jg=0; jg<num_coef_group; ++jg)                                             
							{ 
								for( k = 0; k < group_size; ++ k)
								{
									index_cnt = jg * group_size + k;
									if(index_cnt < coef_length)                                              
									{                                                                  
										sub_coef[k] = coef_mr_arr[index_cnt][i];                      
									}
									else
									{
										sub_coef[k] = 0;
									}
								}
								size = pow(2, group_size);                                               
                                                                                                  
								int conv_value = pow(2, mem_width);                                        
								for(m=0; m< size; m++)                                                     
								{                                                                          
									tmp_coef[0]  = 0;
									itobi(temp, m);//integer to binary                                
									strcpy(bi_index, temp);                                            
									j= strlen(bi_index);                                               
									for(l = 0; l<j; ++l)                                               
									{                                                                  
										if(bi_index[l] == 49)                                      
										{                                                          
											tmp_coef[0] = tmp_coef[0]  + sub_coef[j-1-l];       
										}                                                          
									}                                                                  
									if(tmp_coef[0]  < 0)                                                
									{                                                                  
										tmp_coef[0]  = conv_value + tmp_coef[0] ;                    
									}
									if(jg == 0 && m == 0)
									{
										out_file << "0";
									}
									else
									{
										out_file << "\n"<< tmp_coef[0] ;
									}
								}  
							}                                                                          
						out_file << "\n";
						}
						//out_file << "\n";
					}
				}
				out_file.close();
				temp_file.close();
				//printf("num_coef_group=%d group_size =%d size=%d\n",num_coef_group,group_size,size);
			}
			/**********************************************************************************/
			else
			{
				/**********************************************************************************
				*
				* Write coeficients to file
				* Single-Rate Filter
				*	
				**********************************************************************************/
				out_file.open(out_name, ios::out, filebuf::openprot);
				i = out_file.is_open();
				if (i!=0)
				{
					if(struct_type == MCV)
					{
						out_file <<  coef[0] ;	
						for (i=1; i<mcv_coef_length; ++i)
						{
							out_file << "\n"<< coef[i] ;	
						}
					}
					else
					{
						for (jg=0; jg<num_coef_group; ++jg)                                             
						{ 
							for( k = 0; k < group_size; ++ k)
							{
								index_cnt = jg * group_size + k;
								if(index_cnt < coef_length)                                              
								{                                                                  
									sub_coef[k] = coef[index_cnt];                      
								}
								else
								{
									sub_coef[k] = 0;
								}
							}
							size = pow(2, group_size);                                               
                                                                                                  
							int conv_value = pow(2, mem_width);                                        
							for(m=0; m< size; m++)                                                     
							{                                                                          
								tmp_coef[0]  = 0;
								itobi(temp, m);//integer to binary                                
								strcpy(bi_index, temp);                                            
								j= strlen(bi_index);                                               
								for(l = 0; l<j; ++l)                                               
								{                                                                  
									if(bi_index[l] == 49)                                      
									{                                                          
										tmp_coef[0] = tmp_coef[0]  + sub_coef[j-1-l];       
									}                                                          
								}                                                                  
								if(tmp_coef[0]  < 0)                                                
								{                                                                  
									tmp_coef[0]  = conv_value + tmp_coef[0] ;                    
								}
								if(jg == 0 && m == 0)
								{
									out_file << "0";
								}
								else
								{
									out_file << "\n"<< tmp_coef[0] ;
								}
							}  
						}                                                                          
					}
				}
				out_file.close();
//				printf("num_coef_group=%d group_size =%d size=%d\n",num_coef_group,group_size,size);
			}
		}
	}
	else
	{
		printf("Error:   This program requires 10 arguments! \n ");
	}
	return 0;
}


                                                                                        

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?