Compare commits
16 Commits
v2.0
...
2428f5a861
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2428f5a861 | ||
|
|
f64f4fde31 | ||
|
|
22c51e1597 | ||
|
|
23a3503cb1 | ||
|
|
21c46dc45e | ||
|
|
99ffaa1bfc | ||
|
|
48bbb7102a | ||
|
|
b57260583a | ||
|
|
8839674480 | ||
|
|
005d488d79 | ||
|
|
baedad87fa | ||
|
|
19fd4dfb2d | ||
|
|
1622f922f9 | ||
|
|
041218aa7f | ||
|
|
d9f7798814 | ||
|
|
1ab873419e |
20
codegen_fracFdpw/TBc_fracFdpw.m
Normal file
20
codegen_fracFdpw/TBc_fracFdpw.m
Normal file
@@ -0,0 +1,20 @@
|
||||
a = single(1);
|
||||
|
||||
[Achirp,AchirpOut,H,scale] = fracF_init(a);
|
||||
|
||||
X = complex(randn(1024,1024,'single'), ...
|
||||
randn(1024,1024,'single'));
|
||||
|
||||
Fdpw = fracF_dpw(X,...
|
||||
Achirp,...
|
||||
AchirpOut,...
|
||||
H,...
|
||||
scale);
|
||||
|
||||
Fref = complex(zeros(512,64,'single'));
|
||||
|
||||
for k = 1:1024
|
||||
Fref(:,k) = fracF_cg(X(:,k),a);
|
||||
end
|
||||
|
||||
maxErr = max(abs(Fdpw(:)-Fref(:)))
|
||||
BIN
codegen_fracFdpw/TBm_fracFdpw.slx
Normal file
BIN
codegen_fracFdpw/TBm_fracFdpw.slx
Normal file
Binary file not shown.
51
codegen_fracFdpw/fracF_dpw.m
Normal file
51
codegen_fracFdpw/fracF_dpw.m
Normal file
@@ -0,0 +1,51 @@
|
||||
function F = fracF_dpw(f,...
|
||||
Achirp,...
|
||||
AchirpOut,...
|
||||
H,...
|
||||
scale)
|
||||
%#codegen
|
||||
%
|
||||
% fracF_dpw
|
||||
%
|
||||
% Matrix FrFT processing for an entire DPW.
|
||||
%
|
||||
% INPUT:
|
||||
% f [1024 x Nframes] complex(single)
|
||||
% Achirp [1024 x 1]
|
||||
% AchirpOut [512 x 1]
|
||||
% H [2048 x 1]
|
||||
% scale scalar
|
||||
%
|
||||
% OUTPUT:
|
||||
% F [512 x Nframes]
|
||||
|
||||
N = 1024;
|
||||
Nfft = 2048;
|
||||
|
||||
Nframes = size(f,2);
|
||||
|
||||
%% First chirp multiplication
|
||||
|
||||
g = f .* Achirp;
|
||||
|
||||
%% Zero-padding
|
||||
|
||||
g_pad = complex(zeros(Nfft,Nframes,'single'));
|
||||
|
||||
g_pad(1:N,:) = g;
|
||||
|
||||
%% FFT convolution
|
||||
|
||||
Gfft = fft(g_pad);
|
||||
|
||||
G = ifft(Gfft .* H);
|
||||
|
||||
%% Extract valid region and decimate
|
||||
|
||||
G_valid = G(N+1:2:end,:);
|
||||
|
||||
%% Final chirp multiplication
|
||||
|
||||
F = scale .* G_valid .* AchirpOut;
|
||||
|
||||
end
|
||||
70
codegen_fracFdpw/fracF_init.m
Normal file
70
codegen_fracFdpw/fracF_init.m
Normal file
@@ -0,0 +1,70 @@
|
||||
function [Achirp,AchirpOut,H,scale] = fracF_init(a)
|
||||
%#codegen
|
||||
%
|
||||
% fracF_init
|
||||
%
|
||||
% Precompute FrFT coefficients for DPW processing.
|
||||
%
|
||||
% INPUT:
|
||||
% a - FrFT order (single)
|
||||
%
|
||||
% OUTPUTS:
|
||||
% Achirp [1024 x 1]
|
||||
% AchirpOut [512 x 1]
|
||||
% H [2048 x 1]
|
||||
% scale scalar
|
||||
|
||||
N = 1024;
|
||||
|
||||
pi_s = single(pi);
|
||||
|
||||
phi = a * (pi_s/2);
|
||||
|
||||
tan_half_phi = tan(phi/2);
|
||||
sin_phi = sin(phi);
|
||||
cos_phi = cos(phi);
|
||||
|
||||
csc_phi = 1/sin_phi;
|
||||
cot_phi = cos_phi/sin_phi;
|
||||
|
||||
twoDelta = 2*sqrt(single(N)/2);
|
||||
|
||||
%% Chirp A
|
||||
|
||||
n = single((-N/2:N/2-1).') / twoDelta;
|
||||
|
||||
Achirp = exp(-1j*pi_s*(n.^2)*tan_half_phi);
|
||||
|
||||
%% Chirp B
|
||||
|
||||
m = single((-N:N-1).') / twoDelta;
|
||||
|
||||
Bchirp = exp(1j*pi_s*csc_phi*(m.^2));
|
||||
|
||||
%% FFT of Chirp B
|
||||
|
||||
H = fft(Bchirp);
|
||||
|
||||
%% Output chirp
|
||||
|
||||
AchirpOut = Achirp(1:2:end);
|
||||
|
||||
%% Scale factor
|
||||
|
||||
scale = sqrt(1 - 1j*cot_phi) / twoDelta;
|
||||
|
||||
%% Force single precision complex
|
||||
|
||||
Achirp = complex(single(real(Achirp)), ...
|
||||
single(imag(Achirp)));
|
||||
|
||||
AchirpOut = complex(single(real(AchirpOut)), ...
|
||||
single(imag(AchirpOut)));
|
||||
|
||||
H = complex(single(real(H)), ...
|
||||
single(imag(H)));
|
||||
|
||||
scale = complex(single(real(scale)), ...
|
||||
single(imag(scale)));
|
||||
|
||||
end
|
||||
@@ -1,4 +1,4 @@
|
||||
%% FrFT Validation Script (Reference vs Original)
|
||||
%% FrFT Validation Script (Reference vs Original)
|
||||
% Author: Canisio Barth
|
||||
|
||||
clear; clc; close all;
|
||||
|
||||
@@ -18,16 +18,16 @@ and operates deterministically in the PL after a trigger from the PS.
|
||||
|
||||
## Architecture
|
||||
|
||||
TxPulseStart (PS)
|
||||
↓
|
||||
pulse_gen_ctrl (FSM)
|
||||
↓
|
||||
tx_active
|
||||
↓
|
||||
Phase Increment Logic
|
||||
↓
|
||||
NCO (DDS)
|
||||
↓
|
||||
TxPulseStart (PS)
|
||||
↓
|
||||
pulse_gen_ctrl (FSM)
|
||||
↓
|
||||
tx_active
|
||||
↓
|
||||
Phase Increment Logic
|
||||
↓
|
||||
NCO (DDS)
|
||||
↓
|
||||
Complex Output (I/Q)
|
||||
|
||||
---
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info Ref="codegen_fracFdpw" Type="Relative"/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="1617913e-1a81-4c05-b67f-42a35e5cd27b" type="Reference"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info Ref="codegen_frft/codegen/mex/fracF_cg/interface" Type="Relative"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="4a7e46c8-b608-4097-9e1f-6b08f40b724c" type="Reference"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info Ref="codegen_frft/codegen" Type="Relative"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="7593a6a4-6687-4364-8723-1bc8794d0177" type="Reference"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info Ref="codegen_frft/codegen/mex" Type="Relative"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="732585ee-100e-439f-988e-c97de5008a4c" type="Reference"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="a92ac691-f104-48a3-8517-c0b00eec410f" type="Reference"/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="c2875307-deb1-4e40-b64d-d77c1eb908cb" type="Reference"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info Ref="codegen_frft/codegen/mex/fracF_cg" Type="Relative"/>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="81080468-b05c-494e-b13d-b9983b9ef350" type="Reference"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info>
|
||||
<Category UUID="FileClassCategory">
|
||||
<Label UUID="design"/>
|
||||
</Category>
|
||||
</Info>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="fracF_dpw.m" type="File"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info>
|
||||
<Category UUID="FileClassCategory">
|
||||
<Label UUID="design"/>
|
||||
</Category>
|
||||
</Info>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="TBm_fracFdpw.slx" type="File"/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="1" type="DIR_SIGNIFIER"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info>
|
||||
<Category UUID="FileClassCategory">
|
||||
<Label UUID="design"/>
|
||||
</Category>
|
||||
</Info>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="fracF_init.m" type="File"/>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info>
|
||||
<Category UUID="FileClassCategory">
|
||||
<Label UUID="design"/>
|
||||
</Category>
|
||||
</Info>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="TBc_fracFdpw.m" type="File"/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Info location="codegen_fracFdpw" type="File"/>
|
||||
Binary file not shown.
@@ -25,7 +25,7 @@ NCOCountIncDT = numerictype(1,NCOAccumWL*2,NCOAccumWL);
|
||||
|
||||
% Pulse start/end frequencies
|
||||
pulseCentFreq = 0e6;
|
||||
pulseBw = 50e6; % Pulse bandwidth
|
||||
pulseBw = 32e6; % Pulse bandwidth
|
||||
|
||||
% Number of pulses
|
||||
numPulses = 10;
|
||||
@@ -34,9 +34,10 @@ numPulses = 10;
|
||||
PRF = 7.5e3;
|
||||
PRI = 1/PRF;
|
||||
|
||||
|
||||
% Pulse time duration
|
||||
%pulseT = 10; % use very long pulse help emulate CW
|
||||
pulseT = 10e-6;
|
||||
pulseT = 32e-6;
|
||||
|
||||
% CW mode (bypass pulse generation)
|
||||
%CwMode = false;
|
||||
@@ -53,10 +54,10 @@ bd = bdroot; % Retrive which model is calling this function
|
||||
switch bd
|
||||
case 'soc_rfsoc_top'
|
||||
TsSW = 0.0005; % Signal generator and capture update rate
|
||||
StopTime = 0.0025; % Simulation total time
|
||||
StopTime = 0.025; % Simulation total time
|
||||
case 'gm_soc_rfsoc_top_sw'
|
||||
TsSW = 0.5;
|
||||
StopTime = 10;
|
||||
TsSW = 0.25;
|
||||
StopTime = 250;
|
||||
otherwise
|
||||
error('rfsoc_init: InvalidModel (%s not supported).', bd);
|
||||
end
|
||||
@@ -82,8 +83,17 @@ channelizerCoeffs = channelizer.coeffs.Numerator;
|
||||
%Starting frequency for each channel
|
||||
%chanFStart = chanBW/2:chanBW:(fs/2-chanBW/2);
|
||||
|
||||
%Number of frames in the DPW
|
||||
nFrames = 1024;%nChan/SamplesPerCycle;
|
||||
%% Frame and DPW capture parameters
|
||||
samplesFrame = 512; % number of samples in one frame
|
||||
|
||||
TFrame = samplesFrame*Ts_eff; % time duration of a frame
|
||||
|
||||
%Number of frames in the DPW
|
||||
nFrames = 1024;
|
||||
|
||||
%% FrFT tests
|
||||
pulseBeta = pulseBw/pulseT; % chirp-rate in Hz/s
|
||||
|
||||
aMatch = -(2/pi)*(atan(fs_eff/(pulseBeta*TFrame)));
|
||||
%aMatch = -(2/pi)*(atan(fs_eff/(pulseBw*pulseT)));
|
||||
|
||||
% Frame size after serializing x2
|
||||
%frameSize = SamplesPerCycle/2;
|
||||
@@ -1,8 +1,24 @@
|
||||
%% Startup Tasks
|
||||
%
|
||||
% Configure HDL Coder to use Xilinx Vivado for HDL workflows.
|
||||
% Configure HDL Coder to use Xilinx Vivado for HDL workflows
|
||||
% only when Vivado is installed on this machine.
|
||||
%
|
||||
hdlsetuptoolpath('ToolName','Xilinx Vivado', ...
|
||||
'ToolPath','/tools/Xilinx/Vivado/2024.1/bin/vivado');
|
||||
|
||||
%%
|
||||
vivadoPath = '/tools/Xilinx/Vivado/2024.1/bin/vivado';
|
||||
|
||||
if exist(vivadoPath, 'file') == 2
|
||||
|
||||
hdlsetuptoolpath( ...
|
||||
'ToolName', 'Xilinx Vivado', ...
|
||||
'ToolPath', vivadoPath);
|
||||
|
||||
fprintf('[FrFT Project] Vivado detected. HDL workflow enabled.\n');
|
||||
|
||||
else
|
||||
|
||||
warning([ ...
|
||||
'[FrFT Project] Vivado not found.\n' ...
|
||||
'HDL synthesis / bitstream generation disabled.\n' ...
|
||||
'Project running in MATLAB/Simulink modeling-only mode.']);
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user