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 + -
显示快捷键?