88 Commits

Author SHA1 Message Date
canisio
261984b30f update diagram (added Simulink) 2026-07-02 16:04:00 -03:00
canisio
472dcaf62f diagram update (added PS) 2026-07-02 15:36:04 -03:00
canisio
29a5afbf7e updated diagram (PL side ok) 2026-06-26 13:43:42 -03:00
canisio
577a816dbf updated diagram 2026-06-26 13:41:24 -03:00
canisio
1b56b3c9ca Updated main readme to show the block diagram 2026-06-26 13:15:55 -03:00
canisio
4accb84e4a Added block diagram of the system 2026-06-26 13:12:33 -03:00
canisio
a5990ae650 nFrames reduced to 64. Responsiveness is back. So the FrFT implementation is not optimized on the A53 processor. Nevertheless, peak is not concentrated, I still need to figure out parameters of transform and how to cope with this non-ideal case (real life) 2026-06-26 11:34:02 -03:00
canisio
c0b4435cd0 updated documentation (PS) 2026-06-11 13:00:23 -03:00
canisio
2d668be90f nFrames reduced to 64. Responsiveness is back. So the FrFT implementation is not optimized on the A53 processor. Nevertheless, peak is not concentrated, I still need to figure out parameters of transform and how to cope with this non-ideal case (real life) 2026-06-11 12:43:46 -03:00
canisio
aba2f02820 Test: remove tunnable a 2026-06-11 12:07:30 -03:00
canisio
dd79f8692a fracF_DPW integrated to external mode. Running very slow 2026-06-11 11:32:17 -03:00
canisio
56d3dd647e FracF_DPW integrated to design. Not validated yet. 2026-06-10 17:16:58 -03:00
canisio
a37ded1d73 codegen OK! 2026-06-10 16:36:56 -03:00
canisio
7dd20a04fa compared both TBc and TBm, results are equivalent (not identical because of interpolation filter) 2026-06-10 16:05:30 -03:00
canisio
8f2ae1ec4e Added a LFM matlab script testbench to validate FrFT DPW 2026-06-10 11:46:16 -03:00
canisio
4f5ac3b5f3 Organized codegen for fracFdpw. Tested with random input in matlab script. OK 2026-06-10 09:59:18 -03:00
canisio
943b582d66 ignore generated files/folders from codegen 2026-06-09 16:28:35 -03:00
canisio
2428f5a861 FrFT DPW processing validade in terms of dimensions and code generation 2026-06-09 16:18:00 -03:00
canisio
f64f4fde31 Added codegen folder and scripts for fracF operating in DPW (matrix) 2026-06-09 16:15:39 -03:00
canisio
22c51e1597 FrFT not working (for each error) 2026-06-09 14:54:59 -03:00
canisio
23a3503cb1 initialization of pulse center freq. 2026-06-09 10:51:09 -03:00
canisio
21c46dc45e removed subfolders codegen_frft 2026-05-22 15:58:53 -03:00
canisio
99ffaa1bfc startup funcion adapted to non-vivado machines 2026-05-22 15:42:32 -03:00
canisio
48bbb7102a first tests on FrFT 2026-05-22 12:57:30 -03:00
canisio
b57260583a fft of FrFT block changed from FFTW to auto 2026-05-21 17:30:38 -03:00
canisio
8839674480 renamed the scopes to differentiate sim to hw 2026-05-21 17:22:52 -03:00
canisio
005d488d79 Added variant subsystem and placeholder for FrFT. Simulation OK. External gives error 2026-05-19 17:19:30 -03:00
canisio
baedad87fa NEON optimization enabled for C code generation on both proc and interface models 2026-04-30 17:39:17 -03:00
canisio
19fd4dfb2d second validation of MeanPowSpec before branch to FrFT. Created slides on interface and tested several combinations of paramters. Resulds within expected. 2026-04-30 12:24:24 -03:00
canisio
1622f922f9 MeanPowSpec validated on board 2026-04-29 17:07:10 -03:00
canisio
041218aa7f test MeanPowSpec on ZCU111 2026-04-29 16:35:55 -03:00
canisio
d9f7798814 Added Mean Power Spectrum calculation on PS 2026-04-29 16:10:21 -03:00
canisio
1ab873419e clean version after tagging 2026-04-29 14:11:51 -03:00
canisio
65cef793ac Removed RMS and Fmax outputs
Formatted top diagrams
2026-04-29 11:30:02 -03:00
canisio
99c6b62fc6 Added CwMode as toggle switch 2026-04-29 10:44:14 -03:00
canisio
dc76c69731 added folder "codegen_frft" to the project (it was renamed) 2026-04-29 10:21:17 -03:00
canisio
1d0309f060 Merge branch 'feature/capture-redesign': Integrate capture redesign (multi-frame DMA + validation)
- Redesigned capture pipeline for multi-frame acquisition
- Added 128-bit packing and correct endianness handling
- Implemented and validated counter-based integrity checks
- Verified bypass, channelizer, and pulsed signal modes
- Validated scaling up to nFrames=1024 on ZCU111
- Added checkCounterSamples.m for end-to-end validation

This establishes a stable and validated acquisition baseline for
future work (timestamping, UDP streaming, FrFT processing).
2026-04-29 10:15:07 -03:00
canisio
19b0513809 docs: update documentation for capture redesign and validation 2026-04-29 10:03:34 -03:00
canisio
b3ba729f8b Pulsed input LFM tested on board. Appears ok on both channelizer and bypass. 2026-04-28 17:43:45 -03:00
canisio
c7cb4e770f Simulated with pulsed signal before testing on ZCU111 2026-04-28 16:31:04 -03:00
canisio
6093942ab3 include check scripts to the project.
changed pulseWidth to pulseT.
2026-04-28 15:22:03 -03:00
canisio
edef1dbed3 validation: add checkCounterSamples and verify capture up to 1024 frames on ZCU111
Created checkCounterSamples.m to validate sample continuity, counter wraps,
and frame index progression. Verified counter bypass, sine bypass, and
channelizer modes up to nFrames=1024 across 10 DPWs on ZCU111.
2026-04-27 18:32:31 -03:00
canisio
b8d2d6a5dd updated postload funcion to not break when top is unloaded 2026-04-27 12:21:03 -03:00
canisio
4216288e2a Removed delays from bypass
Removed visualisation from PS
DPW visualization and log outside PS (external mode)
2026-04-27 12:09:46 -03:00
canisio
df335aac1e validation: verified capture pipeline in counter bypass, sine bypass, and sine channelizer modes (nFrames=8)
Validated end-to-end data integrity and visualization across all modes.
2026-04-25 12:58:22 -03:00
canisio
1ebf8aa076 codegen: increase max identifier length to 64 in soc_rfsoc_proc and gm_soc_rfsoc_top_sw
Updated Configuration Parameters (Code Generation -> Identifiers) in both
soc_rfsoc_proc and parent model gm_soc_rfsoc_top_sw to set Maximum identifier
length from 31 to 64. This avoids truncation of generated identifiers, reduces
risk of name collisions, and ensures consistency across referenced models to
prevent build mismatches.
2026-04-25 11:53:24 -03:00
canisio
f9a2eff397 validate sine over bypass using a post processing script in the logged data. Added folter post_processing and script checkTimeSamples 2026-04-25 11:28:43 -03:00
canisio
2f5a466ace Visualization blocks, rate changed to TsSW/nFrames 2026-04-24 17:31:17 -03:00
canisio
ff3aa5e89f Revert "Created valid_out for conter input test"
This reverts commit a7e710b603.
2026-04-24 17:25:45 -03:00
canisio
a7e710b603 Created valid_out for conter input test 2026-04-24 16:36:13 -03:00
canisio
c10736a5d7 AXI4-S2Software>Main>Advanced>Interconnect: Data width (bits) changed to 128 2026-04-24 12:14:14 -03:00
canisio
2b7d05b3d9 FPGA Packer: Changed to uint128, changed endianess order of packing (selectors 4,3,2,1) 2026-04-24 11:59:16 -03:00
canisio
4cbe3b5699 renamed array plots os gm model 2026-04-24 11:33:15 -03:00
canisio
bbf87121f0 changed to upper and lower halves after stream read. No difference (only first lane of 4x1 being read) 2026-04-23 15:26:22 -03:00
canisio
525a5f65e5 unchecked "enable sample packing" on signal attributes of AXI4-stream to software 2026-04-23 08:53:01 -03:00
canisio
9a7a05f450 stream read read only first sample of [4 x 1] bundle 2026-04-22 16:38:16 -03:00
canisio
0df1044d13 Input test counter moved to Rx Subsystem 2026-04-22 14:37:28 -03:00
canisio
f5ec4e6b6e sine and channelizer appear to work on board. Need to move counter to Rx to fully validate sample order 2026-04-22 12:29:13 -03:00
canisio
293b0e6c50 Updated memory mapped addresses 2026-04-22 10:45:07 -03:00
canisio
9a0404f1a9 4 dalay on the signals of bypass to align test counter to frame start. Appears to be working. Test on board. 2026-04-22 10:30:14 -03:00
canisio
6098d86851 problem on the bypass sample counter: if delay sof,eof,vali on FSM input ok for counter but wrong for channelizer 2026-04-21 18:00:44 -03:00
canisio
4ad5c3c5ea appear to be working with 4 daley after multi-frame capture. Problem is on visualization, 2026-04-21 16:19:43 -03:00
canisio
4b1b94c424 Added counter mode as input, real part = sample counter, imag part = frame counter. Reset on software trigger 2026-04-21 12:25:21 -03:00
canisio
78a7d1ae68 updated interface model. Still not working 2026-04-21 10:00:38 -03:00
canisio
97d5494781 updated gm_top_sw. Runs on board, but capture is not in sync 2026-04-20 17:10:59 -03:00
canisio
7f369d8692 runs on the board. But capture is not in sync 2026-04-20 17:09:57 -03:00
canisio
286c464f5a set SoCData as datatype again on the stream read inport (I dont know if this was the problem, but its working again) 2026-04-20 15:04:14 -03:00
canisio
91b02cdc79 organized register... stopped working 2026-04-20 11:53:26 -03:00
canisio
0b1dc081e5 commented display on PS, before testing in the board 2026-04-20 10:51:08 -03:00
canisio
d8fe924f6e tests before trying in the board 2026-04-20 10:49:21 -03:00
canisio
b2ce956f41 Multi-frame capture integrated into full design with trigger-controlled DPW; AXI stream (uint32 [4x1]) and DMA framing aligned; fixed FSM termination condition (no overflow); validated end-to-end (PL→DMA→PS) using counter input for multiple nFrames 2026-04-17 17:03:34 -03:00
canisio
fc50e71ab5 AXI stream updated to uint32 [4x1] format; samples-per-frame aligned to nFrames×512; PS stream read configured accordingly; single-frame (nFrames=1) validated end-to-end (PL→DMA→PS) with correct unpacking and data integrity 2026-04-17 12:22:12 -03:00
canisio
ce87190fba If sw side of AXI4-Stream to Software block is set to fixdt(128), frames appear to be arriving correctly on PS. However, reinterpretation is failing when using option "uint32" 2026-04-17 11:33:18 -03:00
canisio
cb56e78923 changed folder name for all testbench models 2026-04-17 08:31:14 -03:00
canisio
a3d46a9113 New register MF_nFrames added to PS (initialize and data genearation/capture). Not tested 2026-04-16 17:35:10 -03:00
canisio
15f20619b1 MultiFrame camputre PL part integrated (no test, no PS) 2026-04-16 17:25:28 -03:00
canisio
88e9df3dbb Multi-frame capture (trigger-controlled DPW) validated in testbench; added 128-bit packer replacing serializer, correct unpacking (SI reinterpret) and frame reconstruction verified (counter + PFB); implemented VALID gating (zero when idle) and AXI-aligned pipelining; nFrames parameterized in TB 2026-04-16 16:44:44 -03:00
canisio
beb5410390 added visualisation to validate ouput of multiple frames 2026-04-16 11:56:25 -03:00
canisio
2b8f8de030 Validation of multiframe on TBm_capture done. 2026-04-15 17:52:09 -03:00
canisio
9fd110f451 Replace serializer with 128-bit packer and add MultiFrameCapture (testbench)
Removed FIFO serializer and implemented 128-bit AXI packing (4 samples/beat)
Added initial MultiFrameCapture FSM
Validated with counter input
Sine/channelizer validation pending (frame interpretation update needed)
2026-04-14 17:56:57 -03:00
canisio
aad231b55a AXI with 128 bits and no serializer appears to be working 2026-04-14 16:46:18 -03:00
canisio
3748b65872 implemented sample packer to construct 128 AXI. Partially working (only bypass works?) 2026-04-14 12:25:01 -03:00
canisio
d83006c50c Added counter as input for the TBm_capture 2026-04-14 10:32:02 -03:00
canisio
5e5bba3ce6 Stable 16-bit Q1.15 Rx chain before AXI width upgrade 2026-04-14 09:25:01 -03:00
canisio
ccc6b9cd73 Validate 16-bit Q1.15 Rx chain (baseline, partial validation)
Standardized ADC/DAC and channelizer input to fixdt(1,16,15)
Rescaled channelizer output from sFix25_En23 to 16-bit complex
Verified channelizer path and spectrum behavior in full simulation
Bypass path and datatype tuning (coefficients/output) pending validation
2026-04-13 17:47:08 -03:00
canisio
f221e14c2c updated Rx documentation 2026-04-13 16:47:42 -03:00
canisio
a01186484e Rx: standardize to Q1.15 and reduce channelizer output to 32-bit complex
- ADC/DAC set to fixdt(1,16,15)
- Channelizer output scaled from sFix25_En23 to Q1.15
- Data width reduced from 50b to 32b
- Validated channelizer and bypass paths

Model: TBm_capture.slx
2026-04-13 16:47:25 -03:00
canisio
4241699c3d TBm_caputre. changed PFB internals and output datatype 2026-04-09 12:43:32 -03:00
117 changed files with 1624 additions and 179 deletions

12
.gitignore vendored
View File

@@ -49,3 +49,15 @@ soc_rfsoc_top_sw_ert_rtw/
# SimBiology backup files
*.sbproj.backup
*.sbproj.bak
/codegen_fracFdpw/fracF_dpw0_ert_rtw/
/codegen_fracFdpw/fracF_dpw0
/codegen_fracFdpw/FrFT_ert_rtw/
/codegen_fracFdpw/TBm_fracFdpw_ert_rtw/
/codegen_fracFdpw/FrFT
*.lock

View File

@@ -11,22 +11,37 @@ The system implements a high-throughput signal chain in the FPGA (PL) and perfor
## Current Status
- Tx subsystem: LFM pulse generator (DDS-based, complex output)
- Rx subsystem: fully functional channelizer pipeline (PFB-based)
- Rx subsystem: fully functional channelizer pipeline (PFB-based) or bypass
- PL → PS interface: AXI4-Stream + DMA operational
- PS processing: frame-based algorithm (RMS + peak detection)
- PS processing: frame-based algorithm on a Data Process Window (DPW)
---
## System Architecture
ADC → Channelizer (PFB, 512 bins)
FFT_Capture (frame control)
FIFO Serializer (4 FIFOs → 1 stream)
AXI4-Stream (uint64)
Tx (PL)
Waveform Generator (LFM / CW / Pulsed)
DAC
RF Loopback / Input
Rx (PL)
→ ADC
→ Channelizer (PFB, 512 bins) / Bypass / Counter
→ Capture (frame control)
→ AXI4-Stream (128-bit, 4 samples/clock)
→ DMA (S2MM)
→ PS Memory
→ Processor Algorithm
Post Processing (PS)
→ Triggered Capture
→ Sample Unpacking (I/Q)
→ Data Reshaping → [FrameSize x nFrames x nTriggers]
→ Host Communication / Processing / Visualization
→ One DPW is a windows of FrameSize x nFrames samples
![High-level system architecture](./docs/img/resm_diagram.svg)
---
## Key Parameters

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,279 @@
%% Test fracF_dpw using a physical LFM
%
% Parameters chosen to match previous FrFT validation work:
%
% Fs = 512 MHz
% T = 1 us
% B = 64 MHz
%
% Matched FrFT order:
%
% a = -(2/pi)*atan(Fs/(beta*T))
%
% where:
%
% beta = B/T
%
% Notes:
% - FFT is computed on the original (non-interpolated) signal.
% - FrFT is computed on the interpolated signal.
% - Power spectra are averaged across the entire DPW.
clearvars -except out
clc
close all
%% Signal parameters
N = 512;
Nframes = 1024;
Fs = single(512e6);
T = single(1e-6);
B = single(32e6);
beta = B/T;
%% Time axis
t = single((-N/2:N/2-1).') / Fs;
%% Generate LFM
x = exp(1j*pi*beta*(t.^2));
x = complex(single(real(x)), ...
single(imag(x)));
%% Create DPW
X = repmat(x,1,Nframes);
%% Interpolate exactly as Simulink
halfbandInterp = dsp.FIRHalfbandInterpolator;
Xint = halfbandInterp(X);
%% Matched FrFT order
aMatch = single(-(2/pi)*atan(Fs/(beta*T)));
fprintf('\n');
fprintf('Fs = %.3f MHz\n',double(Fs)/1e6);
fprintf('T = %.3f us\n',double(T)*1e6);
fprintf('B = %.3f MHz\n',double(B)/1e6);
fprintf('aMatch = %.6f\n',double(aMatch));
%% FFT reference
%
% FFT detector operates on the original non-interpolated signal.
FFTref = fftshift(fft(X,[],1),1)/N;
%% FrFT
%
% FrFT detector operates on the interpolated signal.
[Achirp,H,Cchirp,Aa] = fracF_init(aMatch);
Ffrft = fracF_dpw( ...
Xint,...
Achirp,...
H,...
Cchirp,...
Aa);
%% Mean power spectrum across the DPW
Pfft = mean(abs(FFTref).^2,2);
Pfrft = mean(abs(Ffrft).^2,2);
%% Peak comparison
peakFFT = max(Pfft);
peakFrFT = max(Pfrft);
gain_dB = 10*log10(double(peakFrFT/peakFFT));
fprintf('\n');
fprintf('FFT peak power : %.6f\n',double(peakFFT));
fprintf('FrFT peak power : %.6f\n',double(peakFrFT));
fprintf('Processing gain : %.3f dB\n',gain_dB);
%% Normalize spectra for display
Pfft_dB = 10*log10(Pfft/max(Pfft));
Pfrft_dB = 10*log10(Pfrft/max(Pfrft));
%% Display averaged spectra
figure
subplot(2,1,1)
plot(Pfft_dB)
grid on
ylim([-60 5])
title('FFT Mean Power Spectrum')
xlabel('FFT Bin')
ylabel('Power (dB)')
subplot(2,1,2)
plot(Pfrft_dB)
grid on
ylim([-60 5])
title(sprintf('FrFT Mean Power Spectrum (a = %.6f)', ...
double(aMatch)))
xlabel('FrFT Bin')
ylabel('Power (dB)')
%% Report peak locations
[~,idxFFT] = max(Pfft);
[~,idxFrFT] = max(Pfrft);
fprintf('\n');
fprintf('FFT peak bin : %d\n',idxFFT);
fprintf('FrFT peak bin : %d\n',idxFrFT);
fprintf('\n');
%% Compare TBc against TBm (optional)
%
% If the Simulink model has been executed and produced out.Fsim,
% compare both implementations.
if exist('out','var')
fprintf('\n');
fprintf('TBc vs TBm Comparison\n');
fprintf('---------------------\n');
Ftbm = out.Fsim;
%% Dimension check
fprintf('TBc size : [%d %d]\n', ...
size(Ffrft,1), size(Ffrft,2));
fprintf('TBm size : [%d %d]\n', ...
size(Ftbm,1), size(Ftbm,2));
assert(isequal(size(Ffrft),size(Ftbm)), ...
'TBc and TBm dimensions differ.');
%% Error metrics
err = Ftbm - Ffrft;
maxErr = max(abs(err(:)));
rmsErr = sqrt(mean(abs(err(:)).^2));
refPeak = max(abs(Ffrft(:)));
relErr = maxErr / refPeak;
%% Results
fprintf('\n');
fprintf('Reference peak : %.9g\n',double(refPeak));
fprintf('Maximum error : %.9g\n',double(maxErr));
fprintf('RMS error : %.9g\n',double(rmsErr));
fprintf('Relative error : %.9g\n',double(relErr));
if maxErr == 0
fprintf('\nPASS: Outputs are bit-identical.\n');
elseif relErr < 1e-5
fprintf('\nPASS: Outputs are numerically equivalent.\n');
else
fprintf('\nWARNING: Outputs differ.\n');
end
%% Visual comparison
frameIdx = 1;
figure
subplot(3,1,1)
plot(abs(Ffrft(:,frameIdx)))
grid on
title('TBc Output')
xlabel('Bin')
ylabel('|F|')
subplot(3,1,2)
plot(abs(Ftbm(:,frameIdx)))
grid on
title('TBm Output')
xlabel('Bin')
ylabel('|F|')
subplot(3,1,3)
plot(abs(Ftbm(:,frameIdx) - Ffrft(:,frameIdx)))
grid on
title('Absolute Error')
xlabel('Bin')
ylabel('|Error|')
%% Mean power spectrum comparison
Ptbc = mean(abs(Ffrft).^2,2);
Ptbm = mean(abs(Ftbm).^2,2);
Ptbc_dB = 10*log10(Ptbc/max(Ptbc));
Ptbm_dB = 10*log10(Ptbm/max(Ptbm));
figure
plot(Ptbc_dB,'LineWidth',1.5)
hold on
plot(Ptbm_dB,'--','LineWidth',1.5)
grid on
ylim([-60 5])
xlabel('Bin')
ylabel('Power (dB)')
title('TBc vs TBm Mean Power Spectrum')
legend('TBc','TBm')
else
fprintf('\n');
fprintf('TBm comparison skipped (out.Fsim not found).\n');
end

View File

@@ -0,0 +1,69 @@
%% fracF_dpw verification
%
% Verifies numerical equivalence between:
% - fracF_cg() : single-frame implementation
% - fracF_dpw() : DPW-aware implementation
%
% The test processes a full DPW of random complex data and compares the
% outputs sample-by-sample.
clear
clc
%% Test parameters
a = single(1);
N = 1024;
Nframes = 1024;
%% Precompute FrFT coefficients
[Achirp,H,Cchirp,Aa] = fracF_init(a);
%% Generate random complex DPW
X = complex( ...
randn(N,Nframes,'single'), ...
randn(N,Nframes,'single'));
%% DPW implementation
Fdpw = fracF_dpw( ...
X,...
Achirp,...
H,...
Cchirp,...
Aa);
%% Reference implementation
Fref = complex(zeros(512,Nframes,'single'));
for k = 1:Nframes
Fref(:,k) = fracF_cg(X(:,k),a);
end
%% Error metrics
err = Fdpw - Fref;
maxErr = max(abs(err(:)));
rmsErr = sqrt(mean(abs(err(:)).^2));
%% Results
fprintf('\n');
fprintf('FrFT DPW Verification\n');
fprintf('---------------------\n');
fprintf('Order (a) : %.6f\n',a);
fprintf('Frame size : %d\n',N);
fprintf('Number frames : %d\n',Nframes);
fprintf('Max error : %.9g\n',double(maxErr));
fprintf('RMS error : %.9g\n',double(rmsErr));
if maxErr == 0
fprintf('\nPASS: Outputs are bit-identical.\n');
else
fprintf('\nPASS: Outputs are numerically equivalent.\n');
end

Binary file not shown.

View File

@@ -0,0 +1,116 @@
function F = fracF_dpw(f,...
Achirp,...
H,...
Cchirp,...
Aa)
%#codegen
%% fracF_dpw Fractional Fourier Transform for an entire DPW
%
% F = fracF_dpw(f,Achirp,H,Cchirp,Aa)
%
% Computes the Fractional Fourier Transform (FrFT) of all frames in a
% Digital Processing Window (DPW) using a matrix-oriented implementation.
%
% The algorithm follows the same chirp-convolution-chirp formulation as
% fracF_cg(), but processes all DPW frames simultaneously. Each column of
% the input matrix is treated as an independent frame, following the same
% "columns are channels" convention used by DSP System Toolbox blocks.
%
% Processing chain:
%
% f
%
% Achirp
%
% Zero-pad
%
% FFT
%
% H
%
% IFFT
%
% Extract
%
% Cchirp
%
% Aa
%
% F
%
% INPUTS
% f [1024 x Nframes] complex(single)
% Interpolated DPW. Each column corresponds to one frame.
%
% Achirp [1024 x 1] complex(single)
% Pre-multiplication chirp (A chirp).
%
% H [2048 x 1] complex(single)
% FFT of the convolution chirp (B chirp).
%
% Cchirp [512 x 1] complex(single)
% Post-multiplication chirp (C chirp).
%
% Aa scalar complex(single)
% FrFT amplitude factor (A_alpha).
%
% OUTPUT
% F [512 x Nframes] complex(single)
% FrFT result for all DPW frames.
%
% Notes
% - Input length is fixed at N = 1024 samples.
% - Output length is N/2 = 512 samples.
% - All DPW frames are processed simultaneously.
% - Numerically equivalent to applying fracF_cg() independently to
% each column of the input matrix.
% - Intended for code generation and RFSoC PS deployment.
%
% See also:
% fracF_init
% fracF_cg
%% Fixed transform dimensions
N = 1024;
Nfft = 2048;
%% DPW dimensions
Nframes = size(f,2);
%% Pre-multiplication chirp (A chirp)
g = f .* Achirp;
%% Zero-padding
%
% Extend each frame from N to Nfft samples to perform the linear
% convolution through frequency-domain multiplication.
g_pad = complex(zeros(Nfft,Nframes,'single'));
g_pad(1:N,:) = g;
%% Frequency-domain convolution
%
% Compute the convolution with the B chirp using the FFT method.
Gfft = fft(g_pad);
G = ifft(Gfft .* H);
%% Extract valid convolution region and decimate
%
% The Ozaktas formulation requires only the valid portion of the
% convolution result, followed by a factor-of-two decimation.
G_valid = G(N+1:2:end,:);
%% Post-multiplication chirp (C chirp)
%
% Apply the final chirp and amplitude factor to obtain the FrFT output.
F = Aa .* G_valid .* Cchirp;
end

View File

@@ -0,0 +1,115 @@
function [Achirp,H,Cchirp,Aa] = fracF_init(a)
%#codegen
%% fracF_init Precompute FrFT coefficients
%
% [Achirp,H,Cchirp,Aa] = fracF_init(a)
%
% Generates the constant coefficients required by the code-generation
% implementation of the Fractional Fourier Transform (FrFT).
%
% The implementation follows the chirp-convolution-chirp formulation:
%
% f(n)
%
% Achirp
%
% FFT
%
% H = FFT(Bchirp)
%
% IFFT
%
% Cchirp
%
% Aa
%
% F_a(n)
%
% These coefficients depend only on the transform order 'a' and can
% therefore be computed once and reused for all frames within a DPW.
%
% INPUT
% a FrFT order (single)
%
% OUTPUTS
% Achirp [1024 x 1] pre-multiplication chirp (A chirp)
% H [2048 x 1] FFT of the convolution chirp (B chirp)
% Cchirp [512 x 1] post-multiplication chirp (C chirp)
% Aa scalar FrFT amplitude factor (A_alpha)
%
% Notes
% - Input length is assumed to be N = 1024 samples.
% - Output length is N/2 = 512 samples.
% - All outputs are returned as complex(single).
% - Intended for use with fracF_dpw().
%
% See also:
% fracF_dpw
%% Fixed transform dimensions
N = 1024;
%% Transform parameters
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;
two_delta = 2*sqrt(single(N)/2);
%% Pre-multiplication chirp (A chirp)
n = single((-N/2:N/2-1).') / two_delta;
Achirp = exp(-1j*pi_s*(n.^2)*tan_half_phi);
%% Convolution chirp (B chirp)
m = single((-N:N-1).') / two_delta;
Bchirp = exp(1j*pi_s*csc_phi*(m.^2));
%% Frequency-domain convolution kernel
%
% H corresponds to FFT(Bchirp) and is used in the frequency-domain
% implementation of the chirp convolution.
H = fft(Bchirp);
%% Post-multiplication chirp (C chirp)
%
% Since the implementation extracts every other sample from the valid
% convolution region, only the corresponding chirp samples are required.
Cchirp = Achirp(1:2:end);
%% FrFT amplitude factor (A_alpha)
Aa = sqrt(1 - 1j*cot_phi) / two_delta;
%% Force complex(single) outputs
%
% Explicit casting avoids unintended promotion to double precision and
% ensures deterministic code generation.
Achirp = complex(single(real(Achirp)), ...
single(imag(Achirp)));
H = complex(single(real(H)), ...
single(imag(H)));
Cchirp = complex(single(real(Cchirp)), ...
single(imag(Cchirp)));
Aa = complex(single(real(Aa)), ...
single(imag(Aa)));
end

View File

@@ -0,0 +1,236 @@
<mxfile host="Electron">
<diagram name="Page-1" id="vQqRMeFAJ5lkNLsEcIIf">
<mxGraphModel dx="1951" dy="1211" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-15" parent="1" style="swimlane;whiteSpace=wrap;html=1;" value="ZCU111-RFSoC" vertex="1">
<mxGeometry height="510" width="1280" x="90" y="120" as="geometry">
<mxRectangle height="30" width="80" x="90" y="120" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-19" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="MkqXqfyG2YaBNjo1GXRg-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.997;entryY=0.458;entryDx=0;entryDy=0;entryPerimeter=0;" target="MkqXqfyG2YaBNjo1GXRg-10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="190" y="122" />
</Array>
<mxPoint x="190" y="122" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-21" connectable="0" parent="MkqXqfyG2YaBNjo1GXRg-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="I - 16bits" vertex="1">
<mxGeometry relative="1" x="-0.1666" as="geometry">
<mxPoint x="-12" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-13" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="MkqXqfyG2YaBNjo1GXRg-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=-0.013;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;dashed=1;dashPattern=8 4 1 4;" target="MkqXqfyG2YaBNjo1GXRg-12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-30" y="127" />
<mxPoint x="-30" y="376" />
</Array>
<mxPoint x="30" y="127" as="sourcePoint" />
<mxPoint x="30" y="376" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-16" connectable="0" parent="MkqXqfyG2YaBNjo1GXRg-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" value="RF LOOPBACK" vertex="1">
<mxGeometry relative="1" x="0.0375" y="-4" as="geometry">
<mxPoint x="8" y="1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-10" parent="2rz5L2cFQ-K9zmRYuQ_V-15" style="rounded=1;whiteSpace=wrap;html=1;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.59,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" value="DAC&lt;div&gt;Data clock = 128MHz&lt;/div&gt;&lt;div&gt;4 Samples/clock&lt;/div&gt;&lt;div&gt;BW = 512MHz&lt;/div&gt;&lt;div&gt;Interpolation = 8X&lt;/div&gt;&lt;div&gt;Fs = 4096MHz&lt;/div&gt;" vertex="1">
<mxGeometry height="110" width="140" x="40" y="72" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-12" parent="2rz5L2cFQ-K9zmRYuQ_V-15" style="rounded=1;whiteSpace=wrap;html=1;" value="ADC&lt;div&gt;Fs = 4096MHz&lt;/div&gt;&lt;div&gt;Decimation = 8X&lt;/div&gt;&lt;div&gt;BW = 512MHz&lt;/div&gt;&lt;div&gt;4 Samples/clock&lt;/div&gt;&lt;div&gt;Data clock = 128MHz&lt;/div&gt;" vertex="1">
<mxGeometry height="110" width="140" x="40" y="321" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-18" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="MkqXqfyG2YaBNjo1GXRg-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.63;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.995;entryY=0.564;entryDx=0;entryDy=0;entryPerimeter=0;" target="MkqXqfyG2YaBNjo1GXRg-10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="261" y="135" />
</Array>
<mxPoint x="340" y="138" as="sourcePoint" />
<mxPoint x="180" y="134" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-20" connectable="0" parent="MkqXqfyG2YaBNjo1GXRg-18" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Q - 16bits" vertex="1">
<mxGeometry relative="1" x="-0.005" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-56" parent="2rz5L2cFQ-K9zmRYuQ_V-15" style="swimlane;whiteSpace=wrap;html=1;fillColor=none;swimlaneFillColor=none;dashed=1;" value="PL" vertex="1">
<mxGeometry height="460" width="490" x="325" y="37" as="geometry">
<mxRectangle height="30" width="140" x="415" y="157" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-2" parent="MkqXqfyG2YaBNjo1GXRg-56" style="swimlane;whiteSpace=wrap;html=1;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.63,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" value="Tx Subsystem" vertex="1">
<mxGeometry height="100" width="190" x="16" y="35" as="geometry">
<mxRectangle height="30" width="120" x="220" y="70" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-1" parent="MkqXqfyG2YaBNjo1GXRg-2" style="rounded=1;whiteSpace=wrap;html=1;" value="Pulsed LFM Generator" vertex="1">
<mxGeometry height="60" width="120" x="35" y="30" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-6" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-56" source="MkqXqfyG2YaBNjo1GXRg-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dashed=1;dashPattern=8 8;startArrow=classic;startFill=1;endArrow=none;endFill=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="345" y="93" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-5" parent="MkqXqfyG2YaBNjo1GXRg-56" style="swimlane;whiteSpace=wrap;html=1;startSize=23;" value="Rx Subsystem" vertex="1">
<mxGeometry height="190" width="458" x="16" y="246" as="geometry">
<mxRectangle height="70" width="138" x="432" y="276" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-6" parent="MkqXqfyG2YaBNjo1GXRg-5" style="rounded=1;whiteSpace=wrap;html=1;" value="Debug Counter" vertex="1">
<mxGeometry height="45" width="50" x="9" y="139" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-37" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" source="MkqXqfyG2YaBNjo1GXRg-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0;entryDx=0;entryDy=0;" target="MkqXqfyG2YaBNjo1GXRg-31" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-8" parent="MkqXqfyG2YaBNjo1GXRg-5" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="PFB 512 Channels" vertex="1">
<mxGeometry height="60" width="66" x="174" y="30" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-38" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" source="MkqXqfyG2YaBNjo1GXRg-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=1;entryDx=0;entryDy=0;" target="MkqXqfyG2YaBNjo1GXRg-31" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-9" parent="MkqXqfyG2YaBNjo1GXRg-5" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="Bypass&lt;div&gt;512 Samples&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="66" x="174" y="122" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-39" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" source="MkqXqfyG2YaBNjo1GXRg-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="MkqXqfyG2YaBNjo1GXRg-36" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-31" parent="MkqXqfyG2YaBNjo1GXRg-5" style="pointerEvents=1;verticalLabelPosition=bottom;shadow=0;dashed=0;align=center;html=1;verticalAlign=top;shape=mxgraph.electrical.electro-mechanical.twoWayContact2;elSwitchState=2;flipH=1;legacyAnchorPoints=0;" value="" vertex="1">
<mxGeometry height="30" width="75" x="266" y="92" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-36" parent="MkqXqfyG2YaBNjo1GXRg-5" style="rounded=1;whiteSpace=wrap;html=1;" value="DPW capture&lt;div&gt;N frames of 512 samples&lt;/div&gt;" vertex="1">
<mxGeometry height="89" width="82" x="358" y="62.5" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-48" parent="MkqXqfyG2YaBNjo1GXRg-5" style="pointerEvents=1;verticalLabelPosition=bottom;shadow=0;dashed=0;align=center;html=1;verticalAlign=top;shape=mxgraph.electrical.electro-mechanical.twoWayContact2;elSwitchState=2;flipH=1;legacyAnchorPoints=0;flipV=1;" value="" vertex="1">
<mxGeometry height="30" width="75" x="59" y="89" as="geometry" />
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-49" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" style="endArrow=classic;html=1;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="5" y="89" as="sourcePoint" />
<mxPoint x="59" y="89" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-50" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.477;exitY=-0.01;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="33" y="119" />
</Array>
<mxPoint x="33" y="138" as="sourcePoint" />
<mxPoint x="60" y="119" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-51" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="148" y="103.5" />
<mxPoint x="148" y="151.5" />
</Array>
<mxPoint x="134" y="103.5" as="sourcePoint" />
<mxPoint x="174.0000000000001" y="151.5" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-52" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;startArrow=classic;startFill=1;endArrow=none;endFill=0;" value="">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="148" y="60" />
<mxPoint x="148" y="89" />
</Array>
<mxPoint x="174" y="60" as="sourcePoint" />
<mxPoint x="148" y="122" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-22" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-56" source="MkqXqfyG2YaBNjo1GXRg-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.999;exitY=0.435;exitDx=0;exitDy=0;exitPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="7" y="332" />
</Array>
<mxPoint x="-143" y="331" as="sourcePoint" />
<mxPoint x="15" y="332" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-23" connectable="0" parent="MkqXqfyG2YaBNjo1GXRg-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="I - 16bits" vertex="1">
<mxGeometry relative="1" x="-0.1666" as="geometry">
<mxPoint x="14" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-24" edge="1" parent="MkqXqfyG2YaBNjo1GXRg-56" source="MkqXqfyG2YaBNjo1GXRg-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.998;exitY=0.545;exitDx=0;exitDy=0;exitPerimeter=0;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="-144" y="344" as="sourcePoint" />
<mxPoint x="15" y="344" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="MkqXqfyG2YaBNjo1GXRg-25" connectable="0" parent="MkqXqfyG2YaBNjo1GXRg-24" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Q - 16bits" vertex="1">
<mxGeometry relative="1" x="-0.005" y="2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" style="swimlane;whiteSpace=wrap;html=1;" value="Shared Memory" vertex="1">
<mxGeometry height="460" width="160" x="860" y="37" as="geometry">
<mxRectangle height="30" width="130" x="950" y="157" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-2" parent="2rz5L2cFQ-K9zmRYuQ_V-1" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;div&gt;DMA Engine&lt;/div&gt;&lt;div&gt;AXI-Stream to&lt;/div&gt;&lt;div&gt;&amp;nbsp;AXI-MM&lt;/div&gt;" vertex="1">
<mxGeometry height="204" width="120" x="20" y="246" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-3" parent="2rz5L2cFQ-K9zmRYuQ_V-1" style="rounded=1;whiteSpace=wrap;html=1;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.38,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" value="AXI-Lite&lt;div&gt;Memory Mapped&lt;/div&gt;&lt;div&gt;Registers&lt;/div&gt;" vertex="1">
<mxGeometry height="120" width="120" x="20" y="40" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-8" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="MkqXqfyG2YaBNjo1GXRg-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.526;entryDx=0;entryDy=0;entryPerimeter=0;" target="2rz5L2cFQ-K9zmRYuQ_V-2" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-9" parent="2rz5L2cFQ-K9zmRYuQ_V-15" style="swimlane;whiteSpace=wrap;html=1;dashed=1;" value="PS" vertex="1">
<mxGeometry height="463" width="200" x="1070" y="37" as="geometry">
<mxRectangle height="30" width="60" x="1160" y="157" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-10" parent="2rz5L2cFQ-K9zmRYuQ_V-9" style="rounded=1;whiteSpace=wrap;html=1;" value="&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Parameters&lt;/span&gt;&lt;br&gt;&lt;ul&gt;&lt;li style=&quot;text-align: left;&quot;&gt;Initialization&lt;/li&gt;&lt;li style=&quot;text-align: left;&quot;&gt;Configuration&lt;/li&gt;&lt;li style=&quot;text-align: left;&quot;&gt;Capture Control&lt;/li&gt;&lt;/ul&gt;" vertex="1">
<mxGeometry height="120" width="120" x="40" y="40" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-12" parent="2rz5L2cFQ-K9zmRYuQ_V-9" style="rounded=1;whiteSpace=wrap;html=1;align=left;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Data Processing&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;DPW periodic read&lt;/li&gt;&lt;li&gt;Unpack samples&lt;/li&gt;&lt;li&gt;Convert to complex type&lt;/li&gt;&lt;li&gt;Reshape to DPW Matrix&lt;/li&gt;&lt;li&gt;Processing algorithm&lt;/li&gt;&lt;/ul&gt;" vertex="1">
<mxGeometry height="238.5" width="160" x="20" y="201.5" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-4" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="2rz5L2cFQ-K9zmRYuQ_V-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.38;exitDx=0;exitDy=0;exitPerimeter=0;" target="MkqXqfyG2YaBNjo1GXRg-2">
<mxGeometry relative="1" as="geometry">
<mxPoint x="580" y="140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-7" connectable="0" parent="2rz5L2cFQ-K9zmRYuQ_V-4" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;CONTROL&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;CONFIG&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry relative="1" x="-0.1353" y="3" as="geometry">
<mxPoint x="6" y="-4" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-11" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="2rz5L2cFQ-K9zmRYuQ_V-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;" target="2rz5L2cFQ-K9zmRYuQ_V-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-13" edge="1" parent="2rz5L2cFQ-K9zmRYuQ_V-15" source="2rz5L2cFQ-K9zmRYuQ_V-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="2rz5L2cFQ-K9zmRYuQ_V-12" value="">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-17" edge="1" parent="1" source="2rz5L2cFQ-K9zmRYuQ_V-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;startSize=6;jumpStyle=none;strokeWidth=6;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" target="2rz5L2cFQ-K9zmRYuQ_V-9" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1480" y="390" as="sourcePoint" />
<mxPoint x="1360" y="395" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-18" connectable="0" parent="2rz5L2cFQ-K9zmRYuQ_V-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=0;" value="TCP-&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;IP&lt;/span&gt;" vertex="1">
<mxGeometry relative="1" x="-0.2058" as="geometry">
<mxPoint y="25" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-16" parent="1" style="swimlane;whiteSpace=wrap;html=1;" value="Simulink" vertex="1">
<mxGeometry height="510" width="200" x="1480" y="120" as="geometry">
<mxRectangle height="30" width="90" x="1480" y="120" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-19" parent="2rz5L2cFQ-K9zmRYuQ_V-16" style="rounded=1;whiteSpace=wrap;html=1;align=left;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Parameters&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Constants&lt;/li&gt;&lt;li&gt;Switches&lt;/li&gt;&lt;li&gt;Slides&lt;/li&gt;&lt;li&gt;Gains&lt;/li&gt;&lt;/ul&gt;" vertex="1">
<mxGeometry height="108" width="110" x="40" y="42" as="geometry" />
</mxCell>
<mxCell id="2rz5L2cFQ-K9zmRYuQ_V-21" parent="2rz5L2cFQ-K9zmRYuQ_V-16" style="rounded=1;whiteSpace=wrap;html=1;align=left;" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;Data Visualization&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style=&quot;text-align: center;&quot;&gt;Spectrum viewer&lt;/li&gt;&lt;li&gt;Array plot&lt;/li&gt;&lt;li&gt;Time scope&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="230" width="160" x="20" y="230" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 536 KiB

View File

@@ -6,11 +6,9 @@
## Overview
The Rx subsystem implements a **polyphase filter bank (PFB) channelizer** followed by FFT processing.
The Rx subsystem implements a **polyphase filter bank (PFB) channelizer** followed by FFT processing, a **bypass path**, and a **multi-frame capture pipeline**.
It converts wideband ADC input into frequency-domain channels and streams the result to the PS.
A **bypass path** is also available for raw data inspection and debugging.
It converts wideband ADC input into frequency-domain channels (or raw samples via bypass) and streams the result to the PS.
---
@@ -24,11 +22,9 @@ PFB Channelizer (Decimation + Filtering)
FFT (512 bins)
FFT Capture
Capture (frame control)
FIFO Serializer (4 → 1)
AXI4-Stream
AXI4-Stream (128-bit, 4 samples/clock)
DMA
@@ -40,45 +36,26 @@ ADC
Bypass Path
FIFO / Serializer
Capture (frame control)
AXI4-Stream
AXI4-Stream (128-bit, 4 samples/clock)
DMA
---
## Bypass Functionality
## Capture Pipeline
The bypass allows direct observation of the input signal without channelization.
### Purpose
- Debugging and validation
- Access to raw ADC-domain data
- Comparison with channelized output
- Verification of downstream processing
---
- Multi-frame acquisition (configurable nFrames)
- Frame size: 512 samples
- Supports asynchronous capture start (not frame-aligned)
- TLAST asserted at frame boundaries
### Behavior
- Input data is routed directly to output
- No filtering or FFT applied
- Maintains same output interface (AXI4-Stream)
---
### Selection Mechanism
A selector signal chooses between:
- Channelizer output (normal operation)
- Bypass output (raw data)
Implementation typically uses:
- Parallel paths
- Output switching logic
- First frame may be partial
- Frames may contain ≤ 2 frame indices (expected)
- DPW spans nFrames frames but covers nFrames + 1 frame regions
---
@@ -86,6 +63,7 @@ Implementation typically uses:
### ADC Input
- Sampling rate: 4096 MSPS
- Data type: **fixdt(1,16,15)** (Q1.15)
### PFB Channelizer
- Decimation: 8
@@ -95,35 +73,67 @@ Implementation typically uses:
- Size: 512
- Produces frequency bins
### FFT Capture
- Controls frame boundaries
### Capture
- Defines frame boundaries (512 samples)
- Generates TLAST
### FIFO Serializer
- Converts parallel streams into single stream
---
## Numeric Format and Scaling
### System Standardization
- End-to-end Q1.15 (**fixdt(1,16,15)**)
### Channelizer Output Scaling
- Native: **sFix25_En23**
- Quantized to: **fixdt(1,16,15)** (round + saturate)
---
## Data Packing (Updated)
- 4 samples per clock
- Each sample: complex (16-bit real + 16-bit imag)
- Packed into **128-bit AXI4-Stream word**
Benefits:
- Matches datapath parallelism
- Efficient DMA transfers
- Eliminates need for serializer stage
---
## AXI4-Stream Output
- Data type: uint64
- Packed real/imag
- Width: 128 bits
- Contains 4 complex samples per cycle
- TLAST = frame boundary
---
## Data Format
## Debug / Validation Features
- Frame size: 512 samples
- Complex values packed into uint64
A counter-based debug mode is implemented:
- Real part → sample counter (0..511)
- Imag part → frame index
Used to validate:
- Sample continuity
- Frame boundaries
- DMA ordering and integrity
---
## Key Characteristics
- Fully streaming pipeline
- High throughput
- Deterministic latency
- Supports dual-mode operation (channelizer / bypass)
- High throughput (4 samples/clock)
- Dual-mode operation (channelizer / bypass)
- Validated up to nFrames = 1024
---

View File

@@ -1,4 +1,4 @@
# 🧠 PS Subsystem (Control + Processing)
# 🧠 PS Subsystem (Control + Capture + Processing)
[🏠 Project Home](../README.md)
@@ -8,78 +8,287 @@
The PS subsystem is responsible for:
- Configuring PL subsystems
- Receiving data via DMA
- Performing frame-based processing
* System initialization
* Configuring PL subsystems
* Triggering captures
* Receiving data via DMA
* Preparing data for processing and visualization
The subsystem now includes an initial **FrFT-based processing chain** implemented in Simulink and targeted to the RFSoC Processing System (PS).
Current work focuses on:
* Algorithm validation
* Code generation
* Hardware integration
* Performance characterization
while maintaining reliable data acquisition and host interaction.
---
## Responsibilities
### Control
### Control & Initialization
- Writes parameters to PL registers:
- Tx generator configuration
- Generates TxPulseStart trigger
* Configure PL parameters:
* Tx waveform configuration
* Capture parameters (nFrames, etc.)
* Initialize DMA and memory buffers
* Manage system startup
---
### Trigger & Capture
* Generates capture trigger (software-controlled)
* Controls DPW acquisition timing
* Each trigger initiates one DPW capture
---
### DMA Handling
- AXI4-Stream → DMA (S2MM)
- Data stored in PS DDR
* AXI4-Stream → DMA (S2MM)
* Receives **128-bit stream** (4 samples per clock)
* Stores data in PS DDR memory
Configuration:
- Frame size: 512
- Buffers: 16
* Frame size: 512 samples
* nFrames: configurable (validated up to 1024)
---
### Processing Pipeline
## Data Format
DMA → uint64[512]
→ unpack real/imag
→ convert to complex
→ RMS + peak detection
### Raw DMA Data
* Packed complex samples
* 16-bit real + 16-bit imag per sample
* 4 samples per 128-bit word
---
### Processing Representation
Data is unpacked and reshaped into:
```text
[FrameSize x nFrames x nTriggers]
```
or, for processing purposes,
```text
[FrameSize x nFrames]
```
representing a single DPW.
---
## Processing Pipeline (Current)
```text
DMA
Unpack samples (I/Q separation)
Convert to complex representation
Reshape into DPW matrix
Processing Path Selection
Path A:
Polyphase Filter Bank (PFB)
Power Spectrum
Path B:
FFT
Power Spectrum
Path C:
FrFT
Mean Power Spectrum
Visualization / Analysis
```
---
## FrFT Processing Status
A first FrFT processing implementation has been integrated into the PS subsystem.
### Processing Flow
```text
DPW [512 x nFrames]
Halfband Interpolation (2x)
FrFT Coefficient Generation
DPW-Aware FrFT Processing
Mean Power Spectrum
```
### Software Structure
```text
codegen_fracFdpw/
├── fracF_init.m
├── fracF_dpw.m
├── TBc_fracFdpw.m
└── TBm_fracFdpw.slx
```
### Validation Completed
* DPW-aware FrFT implementation created
* Verified against original `fracF_cg`
* Bit-identical equivalence achieved
* MATLAB testbench (TBc) created
* Simulink model testbench (TBm) created
* TBc ↔ TBm comparison automated
* Bit-identical TBc ↔ TBm validation achieved
* Standalone subsystem code generation validated
* RFSoC PS integration completed
### Current Status
The implementation is functionally correct and integrated into the RFSoC processing chain.
Current work is focused on:
* Performance characterization
* FrFT parameter optimization
* Realistic pulse processing scenarios
### Open Technical Questions
The matched-order formulation used in the SPL simulations assumed:
```text
Observation Window = Pulse Duration
```
The receiver currently operates under a different condition:
```text
Observation Window < Pulse Duration
```
where only a portion of the pulse is processed by the FrFT.
Additional investigation is required to determine:
* Optimal FrFT order for partial-pulse observations
* Practical DPW sizes
* Trade-off between concentration and processing load
* Deviation from idealized SPL simulation conditions
### Current Limitations
* Coefficients are regenerated every execution
* No coefficient caching implemented
* No NEON-specific optimization
* Generated FFT kernels are used
* Performance scales strongly with DPW size
---
## Validation Support
Uses counter-based validation:
* Real part → sample counter
* Imag part → frame index
Enables verification of:
* Data continuity
* Frame alignment
* Correct ordering from DMA
---
## Execution Model
- Event-driven (DMA trigger)
- No buffering queue
- Frames may be dropped
* Triggered (event-based)
* Burst capture (DPW)
* Not continuous real-time streaming
---
## Performance Notes
- Bottleneck: unpacking + conversion
- Cannot sustain full-rate input
Current implementation prioritizes correctness and validation over optimization.
Observations from RFSoC integration:
* FrFT processing successfully executes on the RFSoC PS
* nFrames = 64 executes responsively
* nFrames = 1024 remains computationally expensive
* Processing load scales approximately linearly with DPW size
* Code generation and subsystem integration have been validated
Current optimization candidates:
* Coefficient caching when FrFT order remains unchanged
* NEON vectorization
* Alternative FFT implementations
* DPW size optimization
---
## Interaction with PL
## Role in System
### Tx Control
- Low-rate trigger (~Hz)
- Starts burst generation
The PS currently serves as:
### Rx Data
- Continuous high-rate stream
* Control interface
* Data acquisition manager
* Signal processing platform
* Algorithm development and validation environment
Current processing capabilities include:
* PFB-based spectral analysis
* FFT-based spectral analysis
* FrFT-based spectral analysis
---
## Future Work
- Replace processing with FrFT
- NEON optimization
- Throughput improvements
### FrFT
* Matched-order optimization for realistic pulse captures
* Performance profiling on RFSoC PS
* Coefficient caching
* NEON optimization
* Detection processing after FrFT concentration
### System
* Timestamp integration
* UDP streaming
* Metadata extraction
* Migration of computationally intensive functions to PL where appropriate
---
## 🔗 Related Components
- [🏠 Project Home](../README.md)
- [PL Tx Subsystem](pl_tx_subsystem.md)
- [PL Rx Subsystem](pl_rx_subsystem.md)
* [🏠 Project Home](../README.md)
* [PL Tx Subsystem](pl_tx_subsystem.md)
* [PL Rx Subsystem](pl_rx_subsystem.md)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBc_lfm_fracF.m" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="fracF_cg.m" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="bizinter.m" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="fracF_ref.m" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBm_lfm_fracF.slx" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="post_processing" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="codegen_fracFdpw" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="1617913e-1a81-4c05-b67f-42a35e5cd27b" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="bypass_block" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="088fd74d-4620-4cf8-826f-495fb91d19ae" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="codegen_frft" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="e5067e19-daed-4732-909a-6dc210e105d6" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_pulsegen" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="6a9c972f-52d5-42e0-8c82-940b26905df7" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="capture_block" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="14d75155-da33-4258-97c9-15567dccec3d" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_bypass" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="f7229047-4926-407b-902a-a25e790af1a9" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="docs/img" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="b625fd14-7cc4-44f4-ae1d-f8256f11241a" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="a92ac691-f104-48a3-8517-c0b00eec410f" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="pulsegen_block" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="e221a7ac-a0f0-4b2d-8909-e0ce275dca2e" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_capture" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="c26ab781-2c03-423c-8199-bc6903e4e4f7" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="utilities/post_processing" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="5bfc0575-1eef-448a-a3a2-ced40deb5860" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="frft_codegen" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="7b5b7cf9-d79f-4236-86f3-d37f9b8a15b3" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="c2875307-deb1-4e40-b64d-d77c1eb908cb" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info File="gm_soc_rfsoc_top_sw.slx" GroupUUID="default" Icon="" Name="Open Interface model" Type="Basic" Visible="1"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="881a1955-5626-41b7-9355-a04f7db84232" type="EntryPoint"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="resm_diagram.svg" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="resm_diagram.drawio" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="fracF_dpw.m" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBc_fracFdpwLFM.m" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBm_fracFdpw.slx" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="fracF_init.m" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBc_fracFdpwNO.m" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="1" type="DIR_SIGNIFIER"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="checkTimeSamples.m" type="File"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="checkFreqSamples.m" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="1" type="DIR_SIGNIFIER"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="checkCounterSamples.m" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="capture_block" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="frft_codegen" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="bypass_block" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="block_pulsegen" type="File"/>

Some files were not shown because too many files have changed in this diff Show More