Преглед на файлове

Добавлен скрипт Octave для разработки fir фильтра компенсатора.

ChStepan преди 1 година
родител
ревизия
5872f3caa2
променени са 6 файла, в които са добавени 925 реда и са изтрити 664 реда
  1. 9 6
      src/src/FftDataFiltering/DecimFilterWrapper.v
  2. 92 0
      src/src/Sim/CicTest.m
  3. 9 7
      src/src/Sim/DecimFilterWrapperTb.v
  4. 65 26
      src/src/Sim/FFTTest.m
  5. 250 125
      src/src/Sim/FilteredData.txt
  6. 500 500
      src/src/Sim/InputSignal.txt

+ 9 - 6
src/src/FftDataFiltering/DecimFilterWrapper.v

@@ -69,9 +69,12 @@ module	DecimFilterWrapper
 	reg		[15:0]	outDataI;
 	reg		[15:0]	outDataQ;
 	
-	localparam	maxWidthForR2	=	6'd28;	//msb for R = 2;
-	localparam	maxWidthForR3	=	6'd33;	//msb for R = 3;
-	localparam	maxWidthForR4	=	6'd35;	//msb for R = 4;
+	localparam	extendBitNum	=	FilteredDataWidth-AdcDataWidth;
+	
+	localparam	maxWidthForR1	=	6'd16;	//msb for R = 2;
+	localparam	maxWidthForR2	=	6'd21;	//msb for R = 2;
+	localparam	maxWidthForR3	=	6'd26;	//msb for R = 3;
+	localparam	maxWidthForR4	=	6'd28;	//msb for R = 4;
 	localparam	maxWidthForR5	=	6'd38;	//msb for R = 5;
 	localparam	maxWidthForR6	=	6'd40;	//msb for R = 6;
 	localparam	maxWidthForR7	=	6'd41;	//msb for R = 7;
@@ -105,8 +108,8 @@ always	@(posedge	Clk_i)	begin
 						decimDataValQR	<=	OscWind_i;
 					end
 			3'd1:	begin
-						outDataI	<=	AdcData_i;
-						outDataQ	<=	AdcData_i;
+						outDataI	<=	decimDataI[maxWidthForR1-:16];
+						outDataQ	<=	decimDataQ[maxWidthForR1-:16];
 						decimDataValIR	<=	OscWind_i;
 						decimDataValQR	<=	OscWind_i;
 					end
@@ -168,7 +171,7 @@ cicFilterInstI
 	.Clk_i			(Clk_i),
 	.Rst_i			(Rst_i),
 	.DecimFactor_i	(DecimFactor_i),
-	.Data_i			({{28{AdcData_i[AdcDataWidth-1]}},AdcData_i}),
+	.Data_i			({{extendBitNum{AdcData_i[AdcDataWidth-1]}},AdcData_i}),
 	.DataNd_i		(OscWind_i),
 	.Data_o			(decimDataI),
 	.DataValid_o	(decimDataValI)

+ 92 - 0
src/src/Sim/CicTest.m

@@ -0,0 +1,92 @@
+FormatSpec = '%d';
+PointsNum = 500;
+N = 4;
+R = 2;
+B = 14;
+M = 1;
+
+Bmax = ceil(log2(((R*M)^N)/R)+B);
+x = 1:1:PointsNum;
+xDecim = 1:1:PointsNum/R;
+Fs = 50;
+
+ReadInDataId = fopen('C:/S5243_FFT_REPO/src/src/Sim/InputSignal.txt','r');
+InDataSignal = fscanf(ReadInDataId,FormatSpec);
+fclose(ReadInDataId);
+
+ReadFilteredDataId = fopen('C:/S5243_FFT_REPO/src/src/Sim/FilteredData.txt','r');
+FilteredData = fscanf(ReadFilteredDataId,FormatSpec);
+fclose(ReadFilteredDataId);
+
+ReadFilterCoefsId = fopen('C:\Users\Work_Pc\Downloads\Telegram Desktop\filterTest.txt','r');
+FilterCoefs = fscanf(ReadFilterCoefsId,FormatSpec);
+fclose(ReadFilterCoefsId);
+
+
+
+InDataFft = fft(InDataSignal);
+InDataFft = InDataFft(1:PointsNum/2);
+
+FilteredDataPNum    =   PointsNum/R;
+
+FilteredDataFft = fft(FilteredData);
+CicResp = 20*log10(abs(FilteredDataFft(1:FilteredDataPNum/2)));
+CicResp = CicResp-max(CicResp)
+
+Freqs = (Fs*(1:(PointsNum/2))/PointsNum);
+FreqsDecim = Fs/R*(1:(FilteredDataPNum/2))/FilteredDataPNum;
+
+FirResponce = 20 * log10(abs(fft(FilterCoefs, FilteredDataPNum)));
+FirResponce = FirResponce(1:FilteredDataPNum/2);
+FirResponce = FirResponce-max(FirResponce)
+
+CicComp = CicResp + FirResponce;
+CicComp = CicComp - max(CicComp);
+
+HCIC = (R^-N*abs(1*M*sin(pi*M*R*FreqsDecim) ./ sin(pi*FreqsDecim)).^N);
+HCICdb = 20 * log10(abs(HCIC));
+
+figure('name','CIC/FIR Frequency Response', 'Numbertitle', 'off')
+  plot(FreqsDecim, FirResponce, '-.', 'LineWidth', 2, 'Color',[0 0 1]);
+  hold on;
+
+  plot(FreqsDecim, CicComp, '--', 'LineWidth', 2, 'Color',[0.2 0.5 0]);
+  hold on;
+
+  plot(FreqsDecim, CicResp, '-', 'LineWidth', 2, 'Color',[1 0 0]);
+  hold on;
+
+  title([{'CIC, Comp. FIR and Result'};{sprintf('Filter Order = %i, Coef. width = %i',NFIR,Bc)}]);
+  xlabel ('Freq (\pi x rad / samples)');
+  ylabel ('Magnitude (dB)');
+  legend('Comp. FIR','Sum Response','CIC filter','location','northeast');
+  grid on;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 9 - 7
src/src/Sim/DecimFilterWrapperTb.v

@@ -48,12 +48,14 @@ always	#10 Clk50	=	~Clk50;
 //==========================================================================================
 
 parameter	N	=	8;
-parameter	M	=	2;
+parameter	M	=	1;
+
+parameter	MaxWidth	=	38;
 
 initial begin
 	Clk50		=	1'b1;
 	Rst			=	1'b1;
-	decimFactor	=	3'd4;
+	decimFactor	=	3'd2;
 #100;
 	Rst		=	1'b0;
 end	
@@ -137,7 +139,7 @@ DecimFilterWrapper
 	.AdcDataWidth	(14),
 	.N	(N),
 	.M	(M),
-	.FilteredDataWidth	(46),
+	.FilteredDataWidth	(MaxWidth),
 	.FirOutDataWidth	(48),
 	.FirOutCutBit		(42)
 )
@@ -151,8 +153,8 @@ DecimFilter
 	.IfFtwL_i		(24'h51eb85),
 	.IfFtwH_i		(24'h23),
 	
-	// .AdcData_i		(singlePulse),
-	.AdcData_i		(sinAdd),
+	.AdcData_i		(singlePulse),
+	// .AdcData_i		(sinAdd),
 	// .AdcData_i		(adcDataMixedCut),
 	
 	.FilteredAdcDataI_o	(resultI),
@@ -224,8 +226,8 @@ always	@(posedge	Clk50)	begin
 	end	else	begin
 		if	(oscWind)	begin
 			// $display("AdcData is %d", sinAdd);
-			$fwrite(inSignal,"%d\n",   sinAdd);
-			// $fwrite(inSignal,"%d\n",   singlePulse);
+			// $fwrite(inSignal,"%d\n",   sinAdd);
+			$fwrite(inSignal,"%d\n",   singlePulse);
 		end	
 	end	
 end

+ 65 - 26
src/src/Sim/FFTTest.m

@@ -1,9 +1,9 @@
 FormatSpec = '%d';
 PointsNum = 500;
 N = 8;
-R = 7;
+R = 2;
 B = 14;
-M = 2;
+M = 1;
 
 K = N*(20*log10(R));
 Knew = 10^(K/20);
@@ -23,6 +23,10 @@ ReadFilteredDataId = fopen('C:/S5243_FFT_REPO/src/src/Sim/FilteredData.txt','r')
 FilteredData = fscanf(ReadFilteredDataId,FormatSpec);
 fclose(ReadFilteredDataId);
 
+ReadFilterCoefsId = fopen('C:\Users\Work_Pc\Downloads\Telegram Desktop\filterTest.txt','r');
+FilterCoefs = fscanf(ReadFilterCoefsId,FormatSpec);
+fclose(ReadFilterCoefsId);
+
 InDataFft = fft(InDataSignal);
 InDataFft = InDataFft(1:PointsNum/2);
 
@@ -34,27 +38,62 @@ FilteredDataFft = FilteredDataFft(1:FilteredDataPNum/2);
 Freqs = Fs*(1:(PointsNum/2))/PointsNum;
 FreqsDecim = Fs/R*(1:(FilteredDataPNum/2))/FilteredDataPNum;
 
-##figure(1)
-##subplot(4,1,1)
-##plot(x, InDataSignal)
-##title("In Signal")
-##xlabel("Time")
-##ylabel("Amp")
-##
-##subplot(4,1,2)
-##plot(Freqs,abs(InDataFft))
-##title("Single-Sided Amplitude Spectrum of InData")
-##xlabel("f (Hz)")
-##ylabel("Amp")
-##
-##subplot(4,1,3)
-##plot(xDecim, FilteredData)
-##title("FilteredData")
-##xlabel("Time")
-##ylabel("Amp")
-##
-##subplot(4,1,4)
-##plot(FreqsDecim,abs(FilteredDataFft))
-##title("Single-Sided Amplitude Spectrum of FilteredData")
-##xlabel("f (Hz)")
-##ylabel("Amp")
+figure(1)
+subplot(4,1,1)
+plot(x, InDataSignal)
+title("In Signal")
+xlabel("Time")
+ylabel("Amp")
+
+subplot(4,1,2)
+plot(Freqs,20*log10(abs(InDataFft)))
+title("Single-Sided Amplitude Spectrum of InData")
+xlabel("f (Hz)")
+ylabel("Amp")
+
+subplot(4,1,3)
+plot(xDecim, FilteredData)
+title("FilteredData")
+xlabel("Time")
+ylabel("Amp")
+
+subplot(4,1,4)
+plot(FreqsDecim,20*log10(abs(FilteredDataFft)))
+title("Single-Sided Amplitude Spectrum of FilteredData")
+xlabel("f (Hz)")
+ylabel("Amp")
+
+FilterResponse = abs(FilteredDataFft);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 250 - 125
src/src/Sim/FilteredData.txt

@@ -1,125 +1,250 @@
-    -1
-    -7
-   -40
-   -70
-   -56
-   -21
-    20
-    55
-    77
-    79
-    62
-    29
-   -11
-   -48
-   -74
-   -82
-   -69
-   -40
-    -1
-    39
-    68
-    81
-    73
-    47
-    10
-   -30
-   -63
-   -80
-   -78
-   -56
-   -21
-    20
-    55
-    77
-    79
-    62
-    29
-   -11
-   -48
-   -74
-   -82
-   -69
-   -40
-    -1
-    39
-    68
-    81
-    73
-    47
-    10
-   -30
-   -63
-   -80
-   -78
-   -56
-   -21
-    20
-    55
-    77
-    79
-    62
-    29
-   -11
-   -48
-   -74
-   -82
-   -69
-   -40
-    -1
-    39
-    68
-    81
-    73
-    47
-    10
-   -30
-   -63
-   -80
-   -78
-   -56
-   -21
-    20
-    55
-    77
-    79
-    62
-    29
-   -11
-   -48
-   -74
-   -82
-   -69
-   -40
-    -1
-    39
-    68
-    81
-    73
-    47
-    10
-   -30
-   -63
-   -80
-   -78
-   -56
-   -21
-    20
-    55
-    77
-    79
-    62
-    29
-   -11
-   -48
-   -74
-   -82
-   -69
-   -40
-    -1
-    39
-    68
-    81
-    73
-    47
-    10
+     0
+     0
+   127
+  3583
+  8958
+  3583
+   127
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0
+     0

Файловите разлики са ограничени, защото са твърде много
+ 500 - 500
src/src/Sim/InputSignal.txt