Bit Reverse in TIE Instruktion implementiert

This commit is contained in:
unknown 2015-03-04 15:28:38 +01:00
parent d7aa4d18fe
commit 0c0c708e70
3 changed files with 35 additions and 18 deletions

24
fft.c
View File

@ -60,14 +60,11 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse)
nn = n - 1; nn = n - 1;
scale = 0; scale = 0;
int mm = m;
/* decimation in time - re-order data */ /* decimation in time - re-order data */
for(m=1; m<=nn; ++m) { for(m=1; m<=nn; ++m) {
l = n; mr = FFT_bit_reverse(m, mm);
do{
l >>= 1;
}while(mr+l > nn);
mr = (mr & (l-1)) + l;
if(mr <= m) continue; if(mr <= m) continue;
tr = fr[m]; tr = fr[m];
@ -119,23 +116,16 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse)
for(m=0; m<l; ++m) for(m=0; m<l; ++m)
{ {
j = m << k; j = m << k;
/* 0 <= j < N_WAVE/2 */
wr = Sinewave[j+N_WAVE/4];
wi = -Sinewave[j];
if(inverse) wi = -wi; FFT_twiddle(wr, wi, j, shift, inverse);
if(shift)
{ FFT_reg reg;
wr >>= 1; fixed *reg_s = ((fixed*) &reg);
wi >>= 1;
}
for(i=m; i<n; i+=istep) for(i=m; i<n; i+=istep)
{ {
j = i + l; j = i + l;
FFT_reg reg;
fixed *reg_s = ((fixed*) &reg);
reg_s[3] = fr[i]; reg_s[3] = fr[i];
reg_s[2] = fr[j]; reg_s[2] = fr[j];
reg_s[1] = fi[i]; reg_s[1] = fi[i];

View File

@ -132,6 +132,31 @@ table SIN_wave 16 1024 {
regfile FFT_reg 64 2 fftv regfile FFT_reg 64 2 fftv
operation FFT_bit_reverse {in AR b, out AR o, in AR m} {}
{
assign o = {
TIEmux(m[2:0], 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, b[0]),
TIEmux(m[2:0], 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, b[0], b[1]),
TIEmux(m[2:0], 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, b[0], b[1], b[2]),
TIEmux(m[2:0], 1'b0, 1'b0, 1'b0, 1'b0, b[0], b[1], b[2], b[3]),
TIEmux(m[2:0], 1'b0, 1'b0, 1'b0, b[0], b[1], b[2], b[3], b[4]),
TIEmux(m[2:0], 1'b0, 1'b0, b[0], b[1], b[2], b[3], b[4], b[5]),
TIEmux(m[2:0], 1'b0, b[0], b[1], b[2], b[3], b[4], b[5], b[6])
};
}
operation FFT_twiddle {out AR wr, out AR wi, in AR j, in BR shift, in BR inverse} {}
{
// 256 = N_WAVE / 4
wire [9:0] idx = TIEadd(j, 256, 1'b0);
wire [15:0] sin = SIN_wave[j];
wire [15:0] wr1 = SIN_wave[idx];
wire [15:0] wi1 = TIEadd(~sin, 16'b0, 1'b1);
wire [15:0] wi2 = TIEmux(inverse, wi1, sin);
assign wr = TIEmux(shift, wr1, {wr1[15], wr1[15:1]});
assign wi = TIEmux(shift, wi2, {wi2[15], wi2[15:1]});
}
operation FFT_calc {inout FFT_reg data, in AR wr, in AR wi, in AR shift} {} operation FFT_calc {inout FFT_reg data, in AR wr, in AR wi, in AR shift} {}
{ {
wire [15:0] fri = data[63:48]; wire [15:0] fri = data[63:48];

2
main.c
View File

@ -73,6 +73,7 @@ int main()
imag_org[i] = 0; imag_org[i] = 0;
} }
/*
//FFT //FFT
fix_fft(real, imag, M, 0); fix_fft(real, imag, M, 0);
fix_fft_org(real_org, imag_org, M, 0); fix_fft_org(real_org, imag_org, M, 0);
@ -86,6 +87,7 @@ int main()
printf("\nIFFT2\n"); printf("\nIFFT2\n");
show_result(real, real_org, imag, imag_org, N); show_result(real, real_org, imag, imag_org, N);
*/
return 0; return 0;
} }