From 71deb0cdbb8213d20801dcf95375fc6a84dc2700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD?= <43981173+UU5JPP@users.noreply.github.com> Date: Mon, 1 Feb 2021 14:25:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=B0=D0=BB=D0=B8=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Stuff/CIC_Filters/rx.m | 252 ++++++++++++++++++++++++++++ Stuff/CIC_Filters/rx_fir_filter.coe | 1 + Stuff/CIC_Filters/tx.m | 252 ++++++++++++++++++++++++++++ Stuff/CIC_Filters/tx_fir_filter.coe | 1 + Stuff/Timers.xlsx | Bin 0 -> 10610 bytes Stuff/cic_nco.xlsx | Bin 0 -> 9835 bytes Stuff/logo.png | Bin 0 -> 21135 bytes 7 files changed, 506 insertions(+) create mode 100644 Stuff/CIC_Filters/rx.m create mode 100644 Stuff/CIC_Filters/rx_fir_filter.coe create mode 100644 Stuff/CIC_Filters/tx.m create mode 100644 Stuff/CIC_Filters/tx_fir_filter.coe create mode 100644 Stuff/Timers.xlsx create mode 100644 Stuff/cic_nco.xlsx create mode 100644 Stuff/logo.png diff --git a/Stuff/CIC_Filters/rx.m b/Stuff/CIC_Filters/rx.m new file mode 100644 index 0000000..6e663f4 --- /dev/null +++ b/Stuff/CIC_Filters/rx.m @@ -0,0 +1,252 @@ +%% ------------------------------------------------------------------------ +% +% Title : test_cic.m +% Author : Alexander Kapitanov +% E-mail : sallador@bk.ru +% Version : 1.0 +% +% ------------------------------------------------------------------------- +% +% Description : +% +% FIR filter compensator to correct freq response after CIC filter. +% +% ------------------------------------------------------------------------- +% +% Version : 1.0 +% Date : 2017.06.03 +% +%% ------------------------------------------------------------------------ +% +% GNU GENERAL PUBLIC LICENSE +% Version 3, 29 June 2007 +% +% Copyright (c) 2018 Kapitanov Alexander +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +% APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +% HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +% OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +% THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +% PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +% IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +% ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +% +%% ------------------------------------------------------------------------ + +set(0, 'DefaultAxesFontSize', 11, 'DefaultAxesFontName', 'Times New Roman'); +set(0, 'DefaultTextFontSize', 11, 'DefaultTextFontName', 'Times New Roman'); + +close all; +clear all; + +%% ------------------------------------------------------------------------ +% ---- CIC Filter Parameters +% ------------------------------------------------------------------------ + +R = 1340; % Decimation factor +N = 6; % Number of stages +M = 1; % Differential delay (only 1) + +%% ------------------------------------------------------------------------ +% ---- FIR filter parameters +% ------------------------------------------------------------------------ + +NFIR = 64; % Filter order, must be odd when Fo = 0.5 !!! +Bc = 32; % Coef. Bit-width +Fo = 0.49; % Normalized Cutoff: 0.2 < Fo < 0.5; +BETA = 8; % BETA parameter for Kaiser window (if IS_WIND = 'Y') + +%% ------------------------------------------------------------------------ +% ---- Save data parameters +% ------------------------------------------------------------------------ + +IS_COE = 'Y'; % create *.COE Xilinx file +IS_HDR = 'N'; % create *.H file (header) +IS_WIND = 'Y'; % use Kaiser Window for FIR corrector + +IS_PLOT_IDL = 'Y'; % plot ideal response +IS_PLOT_FIR = 'Y'; % plot FIR filter IR +IS_PLOT_ERR = 'Y'; % plot total error response in passband + +%% ------------------------------------------------------------------------ +% ---- CIC Compensator Design +% ------------------------------------------------------------------------ + +NFFT = 2^16; % FFT points for Freq Response (spectrum) +STEP = 1/NFFT; % Step size +w = -pi:2*pi/NFFT:pi-2*pi/NFFT; +ff = 0:1/NFFT:1-1/NFFT; +z = exp(1j * w); + +Fc = 1/(2*R); +Fr = Fo/R; + +% 1 way: +%HCIC = (1/R * (1-z.^(-R*M))./(1-z.^(-1))).^ N; +% 2 way: +HCIC = (R^-N*abs(1*M*sin(pi*M*R*ff) ./ sin(pi*ff)).^N); +HCICdb = 20 * log10(abs(HCIC)); + +fp = [0:STEP:Fo]; % Pass band frequency dots +fs = [(Fo+STEP):STEP:0.5]; % Stop band frequency dots +f = [fp fs]*2; % Normalized frequency dots +f(end) = 1; + +% Calculate ideal response +Mp = ones(1, length(fp)); % Pass band response; Mp(1) = 1 +Mp(2:end) = abs(M * R * sin(pi*fp(2:end)/R) ./ sin(pi*M*fp(2:end))).^(N); +Mf = [Mp zeros(1, length(fs))]; + +if (IS_PLOT_IDL == 'Y') + figure('name','FIR Ideal Response', 'Numbertitle', 'off') + plot(f/2, Mf, '-.', 'LineWidth', 2, 'Color',[0 0 1]); + + title([{'FIR Ideal Response'};{sprintf('Fo = %i',Fo)}]); + xlabel ('Freq (\pi x rad / samples)'); + ylabel ('Magnitude'); + axis tight; + legend([{sprintf('Fo = %i',Fo)}]); + grid on; +end + +% Calculate FIR +hFIR = fir2(NFIR-1, f, Mf); % Filter length NFIR +hFIR = hFIR / max(hFIR); % Double coefficients +hCOE = round(hFIR*(2^(Bc-1)-1)); % Fixed point coefficients + +% Windowed FIR (Kaiser with BETA) +if (IS_WIND == 'Y') + WIND = kaiser(NFIR, BETA); % KAISER WINDOW IS USED! + hWIND = fir1(NFIR-1, Fo/R, 'low', WIND); + hNEW = hCOE .* hWIND;% conv2(hCOE,Hwind); + hCOE = hNEW; +end + +if (IS_PLOT_FIR == 'Y') + figure('name','FIR Response', 'Numbertitle', 'off') + plot(hFIR, '-', 'LineWidth', 2, 'Color',[1 0 0]); + + title([{'FIR Response'};{sprintf('Order = %i',NFIR)}]); + xlabel ('Samples'); + ylabel ('Magnitude'); + axis tight; + legend([{sprintf('Order = %i',NFIR)}]); + grid on; +end + +hFFT = 20 * log10(abs(fft(hCOE, ceil(NFFT/R)))); +hFFT = hFFT - max(hFFT); + +H_amp = repmat(hFFT, 1, R); +H_amp = H_amp(1:length(ff)); +H_amp = H_amp - max(H_amp); + +H_comp = HCICdb + H_amp; +H_comp = H_comp - max(H_comp); + +%% ------------------------------------------------------------------------ +% ---- Plot results +% ------------------------------------------------------------------------ + +% ---- Figure #1 +figure('name','CIC/FIR Frequency Response', 'Numbertitle', 'off') + plot(ff, HCICdb - max(HCICdb), '-.', 'LineWidth', 2, 'Color',[0 0 1]); + hold on; + + plot(ff, H_amp, '--', 'LineWidth', 2, 'Color',[0 0.4 0]); + hold on; + + plot(ff, H_comp, '-', '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)'); + axis([0 ff(NFFT)/2 -100 5]); + line([Fr Fr], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + line([Fc Fc], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + line([2*Fc 2*Fc], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + legend('CIC filter','Comp. FIR','Sum Response','location','northeast'); + grid on; + +% ---- Figure #2 +figure('name', 'CIC/FIR Frequency Response (Zoom)', 'Numbertitle', 'off') + plot(ff, HCICdb - max(HCICdb), '-.', 'LineWidth', 2, 'Color',[0 0 1]); + hold on; + + plot(ff, H_amp, '--', 'LineWidth', 2, 'Color',[0 0.4 0]); + hold on; + + plot(ff, H_comp, '-', '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)'); + axis([0 ff(NFFT)/(2*R) -7 1]); + line([Fr Fr], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + grid on; + +%% ------------------------------------------------------------------------ +% ---- Passband irregularity +% ------------------------------------------------------------------------ +if (IS_PLOT_ERR == 'Y') + pass = ceil(0.85*length(H_comp)*Fr); + stp = 0:(0.9*Fr)/pass:(0.9*Fr)-(0.9*Fr)/pass; + stp = stp(2:pass); + Irr = H_comp(2:pass); + Ism = mean(Irr); + Iav = (max(Irr)-min(Irr))/2; + + figure('name', 'Passband irregularity', 'Numbertitle', 'off') + plot(stp, Irr, '--', 'LineWidth', 2, 'Color',[0 0 1]); + line([0 (0.9*Fr)], [Ism Ism], 'LineWidth', 2, 'linestyle', '-', 'Color', [0 0 0]); + grid on; + title([{'Passband irregularity'};{sprintf('Mean value = %f',Ism)};{sprintf('Freq error = %f (dB)',Iav)}]); + xlabel ('Freq (\pi x rad / samples)'); + ylabel ('Magnitude (dB)'); + axis tight; + %axis([0 ff(NFFT)/(2*R) -0.05 1]); +end + +%% ------------------------------------------------------------------------ +% ---- Save coe data to files +% ------------------------------------------------------------------------ +if (IS_COE == 'Y') + fid = fopen ('fir_filter.coe', 'w'); + fprintf(fid, 'Radix = 10;\n'); + fprintf(fid, 'Coefficient_Width = %d;\n', Bc); + fprintf(fid, 'Coefdata =\n'); + for i = 1:NFIR + if (i == NFIR) + fprintf(fid, '%d;\n', hCOE(1,i)); + else + fprintf(fid, '%d,\n', hCOE(1,i)); + end + end + fclose(fid); +end + +if (IS_HDR == 'Y') + fid = fopen ('fir_filter.h', 'w'); + fprintf(fid, 'const int BL = %d;\n', NFIR); + fprintf(fid, 'const int B[%d] = {\n', NFIR); + for i = 1:NFIR + if (i == NFIR) + fprintf(fid, '%d}\n', hCOE(1,i)); + else + fprintf(fid, '%d,\n', hCOE(1,i)); + end + end + fclose(fid); +end + \ No newline at end of file diff --git a/Stuff/CIC_Filters/rx_fir_filter.coe b/Stuff/CIC_Filters/rx_fir_filter.coe new file mode 100644 index 0000000..68b0b55 --- /dev/null +++ b/Stuff/CIC_Filters/rx_fir_filter.coe @@ -0,0 +1 @@ +6.160505e+02,-1.254348e+03,2.073743e+03,-2.985806e+03,3.644942e+03,-3.211210e+03,3.367708e+00,8.935054e+03,-2.840469e+04,6.565131e+04,-1.311256e+05,2.391218e+05,-4.086540e+05,6.639135e+05,-1.035229e+06,1.559089e+06,-2.279361e+06,3.246697e+06,-4.520661e+06,6.168553e+06,-8.270053e+06,1.091595e+07,-1.421878e+07,1.831290e+07,-2.337824e+07,2.964380e+07,-3.743396e+07,4.715353e+07,-5.927002e+07,7.373253e+07,-8.732855e+07,7.814928e+07,7.814928e+07,-8.732855e+07,7.373253e+07,-5.927002e+07,4.715353e+07,-3.743396e+07,2.964380e+07,-2.337824e+07,1.831290e+07,-1.421878e+07,1.091595e+07,-8.270053e+06,6.168553e+06,-4.520661e+06,3.246697e+06,-2.279361e+06,1.559089e+06,-1.035229e+06,6.639135e+05,-4.086540e+05,2.391218e+05,-1.311256e+05,6.565131e+04,-2.840469e+04,8.935054e+03,3.367708e+00,-3.211210e+03,3.644942e+03,-2.985806e+03,2.073743e+03,-1.254348e+03,6.160505e+02 diff --git a/Stuff/CIC_Filters/tx.m b/Stuff/CIC_Filters/tx.m new file mode 100644 index 0000000..886bc88 --- /dev/null +++ b/Stuff/CIC_Filters/tx.m @@ -0,0 +1,252 @@ +%% ------------------------------------------------------------------------ +% +% Title : test_cic.m +% Author : Alexander Kapitanov +% E-mail : sallador@bk.ru +% Version : 1.0 +% +% ------------------------------------------------------------------------- +% +% Description : +% +% FIR filter compensator to correct freq response after CIC filter. +% +% ------------------------------------------------------------------------- +% +% Version : 1.0 +% Date : 2017.06.03 +% +%% ------------------------------------------------------------------------ +% +% GNU GENERAL PUBLIC LICENSE +% Version 3, 29 June 2007 +% +% Copyright (c) 2018 Kapitanov Alexander +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +% APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +% HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +% OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +% THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +% PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +% IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +% ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +% +%% ------------------------------------------------------------------------ + +set(0, 'DefaultAxesFontSize', 11, 'DefaultAxesFontName', 'Times New Roman'); +set(0, 'DefaultTextFontSize', 11, 'DefaultTextFontName', 'Times New Roman'); + +close all; +clear all; + +%% ------------------------------------------------------------------------ +% ---- CIC Filter Parameters +% ------------------------------------------------------------------------ + +R = 3350; % Interpolation factor +N = 6; % Number of stages +M = 1; % Differential delay (only 1) + +%% ------------------------------------------------------------------------ +% ---- FIR filter parameters +% ------------------------------------------------------------------------ + +NFIR = 64; % Filter order, must be odd when Fo = 0.5 !!! +Bc = 32; % Coef. Bit-width +Fo = 0.49; % Normalized Cutoff: 0.2 < Fo < 0.5; +BETA = 8; % BETA parameter for Kaiser window (if IS_WIND = 'Y') + +%% ------------------------------------------------------------------------ +% ---- Save data parameters +% ------------------------------------------------------------------------ + +IS_COE = 'Y'; % create *.COE Xilinx file +IS_HDR = 'N'; % create *.H file (header) +IS_WIND = 'Y'; % use Kaiser Window for FIR corrector + +IS_PLOT_IDL = 'Y'; % plot ideal response +IS_PLOT_FIR = 'Y'; % plot FIR filter IR +IS_PLOT_ERR = 'Y'; % plot total error response in passband + +%% ------------------------------------------------------------------------ +% ---- CIC Compensator Design +% ------------------------------------------------------------------------ + +NFFT = 2^16; % FFT points for Freq Response (spectrum) +STEP = 1/NFFT; % Step size +w = -pi:2*pi/NFFT:pi-2*pi/NFFT; +ff = 0:1/NFFT:1-1/NFFT; +z = exp(1j * w); + +Fc = 1/(2*R); +Fr = Fo/R; + +% 1 way: +%HCIC = (1/R * (1-z.^(-R*M))./(1-z.^(-1))).^ N; +% 2 way: +HCIC = (R^-N*abs(1*M*sin(pi*M*R*ff) ./ sin(pi*ff)).^N); +HCICdb = 20 * log10(abs(HCIC)); + +fp = [0:STEP:Fo]; % Pass band frequency dots +fs = [(Fo+STEP):STEP:0.5]; % Stop band frequency dots +f = [fp fs]*2; % Normalized frequency dots +f(end) = 1; + +% Calculate ideal response +Mp = ones(1, length(fp)); % Pass band response; Mp(1) = 1 +Mp(2:end) = abs(M * R * sin(pi*fp(2:end)/R) ./ sin(pi*M*fp(2:end))).^(N); +Mf = [Mp zeros(1, length(fs))]; + +if (IS_PLOT_IDL == 'Y') + figure('name','FIR Ideal Response', 'Numbertitle', 'off') + plot(f/2, Mf, '-.', 'LineWidth', 2, 'Color',[0 0 1]); + + title([{'FIR Ideal Response'};{sprintf('Fo = %i',Fo)}]); + xlabel ('Freq (\pi x rad / samples)'); + ylabel ('Magnitude'); + axis tight; + legend([{sprintf('Fo = %i',Fo)}]); + grid on; +end + +% Calculate FIR +hFIR = fir2(NFIR-1, f, Mf); % Filter length NFIR +hFIR = hFIR / max(hFIR); % Double coefficients +hCOE = round(hFIR*(2^(Bc-1)-1)); % Fixed point coefficients + +% Windowed FIR (Kaiser with BETA) +if (IS_WIND == 'Y') + WIND = kaiser(NFIR, BETA); % KAISER WINDOW IS USED! + hWIND = fir1(NFIR-1, Fo/R, 'low', WIND); + hNEW = hCOE .* hWIND;% conv2(hCOE,Hwind); + hCOE = hNEW; +end + +if (IS_PLOT_FIR == 'Y') + figure('name','FIR Response', 'Numbertitle', 'off') + plot(hFIR, '-', 'LineWidth', 2, 'Color',[1 0 0]); + + title([{'FIR Response'};{sprintf('Order = %i',NFIR)}]); + xlabel ('Samples'); + ylabel ('Magnitude'); + axis tight; + legend([{sprintf('Order = %i',NFIR)}]); + grid on; +end + +hFFT = 20 * log10(abs(fft(hCOE, ceil(NFFT/R)))); +hFFT = hFFT - max(hFFT); + +H_amp = repmat(hFFT, 1, R); +H_amp = H_amp(1:length(ff)); +H_amp = H_amp - max(H_amp); + +H_comp = HCICdb + H_amp; +H_comp = H_comp - max(H_comp); + +%% ------------------------------------------------------------------------ +% ---- Plot results +% ------------------------------------------------------------------------ + +% ---- Figure #1 +figure('name','CIC/FIR Frequency Response', 'Numbertitle', 'off') + plot(ff, HCICdb - max(HCICdb), '-.', 'LineWidth', 2, 'Color',[0 0 1]); + hold on; + + plot(ff, H_amp, '--', 'LineWidth', 2, 'Color',[0 0.4 0]); + hold on; + + plot(ff, H_comp, '-', '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)'); + axis([0 ff(NFFT)/2 -100 5]); + line([Fr Fr], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + line([Fc Fc], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + line([2*Fc 2*Fc], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + legend('CIC filter','Comp. FIR','Sum Response','location','northeast'); + grid on; + +% ---- Figure #2 +figure('name', 'CIC/FIR Frequency Response (Zoom)', 'Numbertitle', 'off') + plot(ff, HCICdb - max(HCICdb), '-.', 'LineWidth', 2, 'Color',[0 0 1]); + hold on; + + plot(ff, H_amp, '--', 'LineWidth', 2, 'Color',[0 0.4 0]); + hold on; + + plot(ff, H_comp, '-', '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)'); + axis([0 ff(NFFT)/(2*R) -7 1]); + line([Fr Fr], [-400 200], 'LineWidth', 1, 'linestyle', '--', 'Color', [0 0 0]); + grid on; + +%% ------------------------------------------------------------------------ +% ---- Passband irregularity +% ------------------------------------------------------------------------ +if (IS_PLOT_ERR == 'Y') + pass = ceil(0.85*length(H_comp)*Fr); + stp = 0:(0.9*Fr)/pass:(0.9*Fr)-(0.9*Fr)/pass; + stp = stp(2:pass); + Irr = H_comp(2:pass); + Ism = mean(Irr); + Iav = (max(Irr)-min(Irr))/2; + + figure('name', 'Passband irregularity', 'Numbertitle', 'off') + plot(stp, Irr, '--', 'LineWidth', 2, 'Color',[0 0 1]); + line([0 (0.9*Fr)], [Ism Ism], 'LineWidth', 2, 'linestyle', '-', 'Color', [0 0 0]); + grid on; + title([{'Passband irregularity'};{sprintf('Mean value = %f',Ism)};{sprintf('Freq error = %f (dB)',Iav)}]); + xlabel ('Freq (\pi x rad / samples)'); + ylabel ('Magnitude (dB)'); + axis tight; + %axis([0 ff(NFFT)/(2*R) -0.05 1]); +end + +%% ------------------------------------------------------------------------ +% ---- Save coe data to files +% ------------------------------------------------------------------------ +if (IS_COE == 'Y') + fid = fopen ('fir_filter.coe', 'w'); + fprintf(fid, 'Radix = 10;\n'); + fprintf(fid, 'Coefficient_Width = %d;\n', Bc); + fprintf(fid, 'Coefdata =\n'); + for i = 1:NFIR + if (i == NFIR) + fprintf(fid, '%d;\n', hCOE(1,i)); + else + fprintf(fid, '%d,\n', hCOE(1,i)); + end + end + fclose(fid); +end + +if (IS_HDR == 'Y') + fid = fopen ('fir_filter.h', 'w'); + fprintf(fid, 'const int BL = %d;\n', NFIR); + fprintf(fid, 'const int B[%d] = {\n', NFIR); + for i = 1:NFIR + if (i == NFIR) + fprintf(fid, '%d}\n', hCOE(1,i)); + else + fprintf(fid, '%d,\n', hCOE(1,i)); + end + end + fclose(fid); +end + \ No newline at end of file diff --git a/Stuff/CIC_Filters/tx_fir_filter.coe b/Stuff/CIC_Filters/tx_fir_filter.coe new file mode 100644 index 0000000..c3f9e73 --- /dev/null +++ b/Stuff/CIC_Filters/tx_fir_filter.coe @@ -0,0 +1 @@ +6.161515e+02,-1.254539e+03,2.074036e+03,-2.986196e+03,3.645380e+03,-3.211562e+03,3.366273e+00,8.935876e+03,-2.840705e+04,6.565619e+04,-1.311343e+05,2.391357e+05,-4.086749e+05,6.639427e+05,-1.035267e+06,1.559137e+06,-2.279419e+06,3.246760e+06,-4.520726e+06,6.168612e+06,-8.270095e+06,1.091596e+07,-1.421874e+07,1.831279e+07,-2.337803e+07,2.964346e+07,-3.743344e+07,4.715279e+07,-5.926900e+07,7.373117e+07,-8.732687e+07,7.814772e+07,7.814772e+07,-8.732687e+07,7.373117e+07,-5.926900e+07,4.715279e+07,-3.743344e+07,2.964346e+07,-2.337803e+07,1.831279e+07,-1.421874e+07,1.091596e+07,-8.270095e+06,6.168612e+06,-4.520726e+06,3.246760e+06,-2.279419e+06,1.559137e+06,-1.035267e+06,6.639427e+05,-4.086749e+05,2.391357e+05,-1.311343e+05,6.565619e+04,-2.840705e+04,8.935876e+03,3.366273e+00,-3.211562e+03,3.645380e+03,-2.986196e+03,2.074036e+03,-1.254539e+03,6.161515e+02 diff --git a/Stuff/Timers.xlsx b/Stuff/Timers.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d552b7d5ecdad0aa3bccb15cd8626c11ef9ce8d5 GIT binary patch literal 10610 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 literal 0 HcmV?d00001 diff --git a/Stuff/cic_nco.xlsx b/Stuff/cic_nco.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..32f5f10085b1762ba67c18a6b97ebfee30b85b2f GIT binary patch literal 9835 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 WNfsVz!9TeiRDc=O2@WZKj{Xl|Jh6KK literal 0 HcmV?d00001 diff --git a/Stuff/logo.png b/Stuff/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d18affcce23b960cf38b2c5f55f180c6e098b4a5 GIT binary patch literal 21135 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 literal 0 HcmV?d00001