Compare commits
130 Commits
13263f4f33
...
feature/ps
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
261984b30f | ||
|
|
472dcaf62f | ||
|
|
29a5afbf7e | ||
|
|
577a816dbf | ||
|
|
1b56b3c9ca | ||
|
|
4accb84e4a | ||
|
|
a5990ae650 | ||
|
|
c0b4435cd0 | ||
|
|
2d668be90f | ||
|
|
aba2f02820 | ||
|
|
dd79f8692a | ||
|
|
56d3dd647e | ||
|
|
a37ded1d73 | ||
|
|
7dd20a04fa | ||
|
|
8f2ae1ec4e | ||
|
|
4f5ac3b5f3 | ||
|
|
943b582d66 | ||
|
|
2428f5a861 | ||
|
|
f64f4fde31 | ||
|
|
22c51e1597 | ||
|
|
23a3503cb1 | ||
|
|
21c46dc45e | ||
|
|
99ffaa1bfc | ||
|
|
48bbb7102a | ||
|
|
b57260583a | ||
|
|
8839674480 | ||
|
|
005d488d79 | ||
|
|
baedad87fa | ||
|
|
19fd4dfb2d | ||
|
|
1622f922f9 | ||
|
|
041218aa7f | ||
|
|
d9f7798814 | ||
|
|
1ab873419e | ||
|
|
65cef793ac | ||
|
|
99c6b62fc6 | ||
|
|
dc76c69731 | ||
|
|
1d0309f060 | ||
|
|
19b0513809 | ||
|
|
b3ba729f8b | ||
|
|
c7cb4e770f | ||
|
|
6093942ab3 | ||
|
|
edef1dbed3 | ||
|
|
b8d2d6a5dd | ||
|
|
4216288e2a | ||
|
|
df335aac1e | ||
|
|
1ebf8aa076 | ||
|
|
f9a2eff397 | ||
|
|
2f5a466ace | ||
|
|
ff3aa5e89f | ||
|
|
a7e710b603 | ||
|
|
c10736a5d7 | ||
|
|
2b7d05b3d9 | ||
|
|
4cbe3b5699 | ||
|
|
bbf87121f0 | ||
|
|
525a5f65e5 | ||
|
|
9a7a05f450 | ||
|
|
0df1044d13 | ||
|
|
f5ec4e6b6e | ||
|
|
293b0e6c50 | ||
|
|
9a0404f1a9 | ||
|
|
6098d86851 | ||
|
|
4ad5c3c5ea | ||
|
|
4b1b94c424 | ||
|
|
78a7d1ae68 | ||
|
|
97d5494781 | ||
|
|
7f369d8692 | ||
|
|
286c464f5a | ||
|
|
91b02cdc79 | ||
|
|
0b1dc081e5 | ||
|
|
d8fe924f6e | ||
|
|
b2ce956f41 | ||
|
|
fc50e71ab5 | ||
|
|
ce87190fba | ||
|
|
cb56e78923 | ||
|
|
a3d46a9113 | ||
|
|
15f20619b1 | ||
|
|
88e9df3dbb | ||
|
|
beb5410390 | ||
|
|
2b8f8de030 | ||
|
|
9fd110f451 | ||
|
|
aad231b55a | ||
|
|
3748b65872 | ||
|
|
d83006c50c | ||
|
|
5e5bba3ce6 | ||
|
|
ccc6b9cd73 | ||
|
|
f221e14c2c | ||
|
|
a01186484e | ||
|
|
4241699c3d | ||
|
|
d4e53a67ee | ||
|
|
2e570cee8b | ||
|
|
f8edb31dc2 | ||
|
|
520a37f520 | ||
|
|
cd91e3066b | ||
|
|
5a3bc8891d | ||
|
|
fdde9ec62b | ||
|
|
84b795203a | ||
|
|
ada7e324cd | ||
|
|
7813d9744c | ||
|
|
05b74503dc | ||
|
|
72b9a34db9 | ||
|
|
3c6ae0cfe9 | ||
|
|
eb14676581 | ||
|
|
040834d511 | ||
|
|
a92709b500 | ||
|
|
27ec12161c | ||
|
|
5caaa7fd9a | ||
|
|
ea0ecefae1 | ||
|
|
e810145620 | ||
|
|
a82aed0d5a | ||
|
|
62ab58b741 | ||
|
|
8e397fa41e | ||
|
|
790c2fdb37 | ||
|
|
872fbfcd6e | ||
|
|
9794b2d540 | ||
|
|
b72a8cd616 | ||
|
|
f66c3ffd06 | ||
|
|
0c6938bff2 | ||
|
|
66ad6149e6 | ||
|
|
a9b4ad9e17 | ||
|
|
0ea6881d1e | ||
|
|
278e318715 | ||
|
|
e0765a6afe | ||
|
|
dd70d58f2a | ||
|
|
d8a9e026ff | ||
|
|
1613ae8ad9 | ||
|
|
7b04d52204 | ||
|
|
30b31509c1 | ||
|
|
10644b0475 | ||
|
|
43f91b281b | ||
|
|
89ecf79e61 |
12
.gitignore
vendored
12
.gitignore
vendored
@@ -49,3 +49,15 @@ soc_rfsoc_top_sw_ert_rtw/
|
|||||||
# SimBiology backup files
|
# SimBiology backup files
|
||||||
*.sbproj.backup
|
*.sbproj.backup
|
||||||
*.sbproj.bak
|
*.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
|
||||||
|
|||||||
94
README.md
Normal file
94
README.md
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# 📡 RFSoC Channelizer + PS Processing (R-ESM Prototype)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This project is based on the RFSoC SoC Blockset reference design, adapted as a prototype for a Radar Electronic Support Measures (R-ESM) receiver.
|
||||||
|
|
||||||
|
The system implements a high-throughput signal chain in the FPGA (PL) and performs frame-based processing in the processor (PS).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Current Status
|
||||||
|
|
||||||
|
- Tx subsystem: LFM pulse generator (DDS-based, complex output)
|
||||||
|
- Rx subsystem: fully functional channelizer pipeline (PFB-based) or bypass
|
||||||
|
- PL → PS interface: AXI4-Stream + DMA operational
|
||||||
|
- PS processing: frame-based algorithm on a Data Process Window (DPW)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## System Architecture
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Parameters
|
||||||
|
|
||||||
|
- ADC Sampling Rate: 4096 MSPS
|
||||||
|
- Decimation: 8
|
||||||
|
- Effective BW: 512 MHz
|
||||||
|
- Channels (FFT size): 512
|
||||||
|
- Samples per clock: 4
|
||||||
|
- FPGA clock: 128 MHz
|
||||||
|
- Frame size (PS): 512 samples
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Documentation
|
||||||
|
|
||||||
|
### FPGA (PL)
|
||||||
|
|
||||||
|
- [Tx Subsystem (Pulse Generator)](docs/pl_tx_subsystem.md)
|
||||||
|
- [Rx Subsystem (Channelizer)](docs/pl_rx_subsystem.md)
|
||||||
|
|
||||||
|
### Processor (PS)
|
||||||
|
|
||||||
|
- [PS Subsystem](docs/ps_subsystem.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## System Flow
|
||||||
|
|
||||||
|
Tx → Rx → PS
|
||||||
|
|
||||||
|
- Tx generates waveform
|
||||||
|
- Rx captures and channelizes
|
||||||
|
- PS processes frames
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
1. Functional FrFT (PS)
|
||||||
|
2. Profiling
|
||||||
|
3. NEON optimization
|
||||||
|
4. Throughput tuning
|
||||||
|
5. PL acceleration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Takeaway
|
||||||
|
|
||||||
|
First make it work end-to-end, then make it fast.
|
||||||
BIN
block_bypass/TBm_bypass.slx
Normal file
BIN
block_bypass/TBm_bypass.slx
Normal file
Binary file not shown.
BIN
block_capture/TBm_capture.slx
Normal file
BIN
block_capture/TBm_capture.slx
Normal file
Binary file not shown.
BIN
block_pulsegen/TBm_pulsegen.slx
Normal file
BIN
block_pulsegen/TBm_pulsegen.slx
Normal file
Binary file not shown.
279
codegen_fracFdpw/TBc_fracFdpwLFM.m
Normal file
279
codegen_fracFdpw/TBc_fracFdpwLFM.m
Normal 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
|
||||||
69
codegen_fracFdpw/TBc_fracFdpwNO.m
Normal file
69
codegen_fracFdpw/TBc_fracFdpwNO.m
Normal 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
|
||||||
BIN
codegen_fracFdpw/TBm_fracFdpw.slx
Normal file
BIN
codegen_fracFdpw/TBm_fracFdpw.slx
Normal file
Binary file not shown.
116
codegen_fracFdpw/fracF_dpw.m
Normal file
116
codegen_fracFdpw/fracF_dpw.m
Normal 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
|
||||||
115
codegen_fracFdpw/fracF_init.m
Normal file
115
codegen_fracFdpw/fracF_init.m
Normal 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
|
||||||
BIN
codegen_frft/.slx
Normal file
BIN
codegen_frft/.slx
Normal file
Binary file not shown.
142
codegen_frft/TBc_lfm_fracF.m
Normal file
142
codegen_frft/TBc_lfm_fracF.m
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
%% FrFT Validation Script (Reference vs Original)
|
||||||
|
% Author: Canisio Barth
|
||||||
|
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
%% Parameters
|
||||||
|
Fs = 512e6; % Sampling rate
|
||||||
|
T = 1e-6; % Signal duration
|
||||||
|
N = Fs*T; % 512 samples
|
||||||
|
|
||||||
|
n = (0:N-1).';
|
||||||
|
t = (n - N/2)/ Fs;
|
||||||
|
|
||||||
|
% Beta range (Hz/s)
|
||||||
|
betas = (-32e12 : 8e12 : 32e12);
|
||||||
|
|
||||||
|
% Order sweep (for heatmap)
|
||||||
|
a_vec = linspace( 0.5, 1.5, 100);
|
||||||
|
|
||||||
|
% Center frequency
|
||||||
|
f0 = 0e6; % center frequency (Hz) — set as needed
|
||||||
|
|
||||||
|
%% ============================================================
|
||||||
|
%% A) HEATMAP (single chirp, order sweep)
|
||||||
|
%% ============================================================
|
||||||
|
|
||||||
|
beta0 = 64e12; % pick one chirp for visualization
|
||||||
|
|
||||||
|
% Generate LFM chirp
|
||||||
|
x = exp(1j*(2*pi*f0*t + pi*beta0*t.^2));
|
||||||
|
|
||||||
|
% External interpolation (IMPORTANT)
|
||||||
|
x_interp = bizinter(x);
|
||||||
|
|
||||||
|
N_interp = length(x_interp);
|
||||||
|
N_out = N_interp/2; % after decimation
|
||||||
|
|
||||||
|
% Allocate
|
||||||
|
FrFT_map_ref = zeros(N_out, length(a_vec));
|
||||||
|
FrFT_map_cmp = zeros(N_out, length(a_vec));
|
||||||
|
|
||||||
|
for k = 1:length(a_vec)
|
||||||
|
a = a_vec(k);
|
||||||
|
|
||||||
|
% Reference
|
||||||
|
y_ref = fracF_ref(x_interp, a);
|
||||||
|
%y_ref = fracF_cg(x_interp, a);
|
||||||
|
|
||||||
|
% Comparison (original / other implementation)
|
||||||
|
%y_cmp = fracF_cg(x_interp, a);
|
||||||
|
y_cmp = fracF_cg_mex(single(x_interp), single(a));
|
||||||
|
|
||||||
|
FrFT_map_ref(:,k) = y_ref;
|
||||||
|
FrFT_map_cmp(:,k) = double(y_cmp);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Global relative error
|
||||||
|
rel_err_global = norm(FrFT_map_ref(:) - FrFT_map_cmp(:)) / ...
|
||||||
|
norm(FrFT_map_ref(:));
|
||||||
|
|
||||||
|
fprintf('Global relative error: %.3e\n', rel_err_global);
|
||||||
|
|
||||||
|
% Plot - Reference
|
||||||
|
figure;
|
||||||
|
imagesc(a_vec, -N_out/2:N_out/2-1, abs(FrFT_map_ref) / sqrt(N));
|
||||||
|
axis xy;
|
||||||
|
xlabel('Order a');
|
||||||
|
ylabel('Index');
|
||||||
|
title('FrFT Magnitude (Reference)');
|
||||||
|
colorbar;
|
||||||
|
|
||||||
|
% Plot - Comparison
|
||||||
|
figure;
|
||||||
|
imagesc(a_vec, -N_out/2:N_out/2-1, abs(FrFT_map_cmp) / sqrt(N));
|
||||||
|
axis xy;
|
||||||
|
xlabel('Order a');
|
||||||
|
ylabel('Index');
|
||||||
|
title('FrFT Magnitude (Comparison)');
|
||||||
|
colorbar;
|
||||||
|
|
||||||
|
% Plot - Difference
|
||||||
|
figure;
|
||||||
|
rel_err_map = abs(FrFT_map_ref - FrFT_map_cmp) ./ ...
|
||||||
|
(abs(FrFT_map_ref) + eps);
|
||||||
|
|
||||||
|
imagesc(a_vec, -N_out/2:N_out/2-1, rel_err_map);
|
||||||
|
axis xy;
|
||||||
|
xlabel('Order a');
|
||||||
|
ylabel('Index');
|
||||||
|
title('Absolute Difference |Ref - Cmp|');
|
||||||
|
colorbar;
|
||||||
|
|
||||||
|
|
||||||
|
%% ============================================================
|
||||||
|
%% B) PEAK VS BETA (matched order)
|
||||||
|
%% ============================================================
|
||||||
|
|
||||||
|
peak_ref = zeros(size(betas));
|
||||||
|
peak_cmp = zeros(size(betas));
|
||||||
|
|
||||||
|
for i = 1:length(betas)
|
||||||
|
beta = betas(i);
|
||||||
|
|
||||||
|
% Generate chirp
|
||||||
|
x = exp(1j*(2*pi*f0*t + pi*beta*t.^2));
|
||||||
|
|
||||||
|
% External interpolation
|
||||||
|
x_interp = bizinter(x);
|
||||||
|
|
||||||
|
% Matched order
|
||||||
|
a = -(2/pi)*atan(Fs/(beta*T));
|
||||||
|
|
||||||
|
% Compute FrFT
|
||||||
|
y_ref = fracF_ref(x_interp, a);
|
||||||
|
%y_ref = fracF_cg(x_interp, a);
|
||||||
|
|
||||||
|
%y_cmp = fracF_cg(x_interp, a);
|
||||||
|
y_cmp = fracF_cg_mex(single(x_interp), single(a));
|
||||||
|
|
||||||
|
% Normalized peak magnitude
|
||||||
|
peak_ref(i) = max(abs(y_ref)) / sqrt(N);
|
||||||
|
peak_cmp(i) = max(abs(y_cmp)) / sqrt(N);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Plot peaks
|
||||||
|
figure;
|
||||||
|
plot(betas/1e12, peak_ref, 'o-', 'LineWidth', 1.5); hold on;
|
||||||
|
plot(betas/1e12, peak_cmp, 's--', 'LineWidth', 1.5);
|
||||||
|
xlabel('\beta (MHz/\mus)');
|
||||||
|
ylabel('Peak Magnitude');
|
||||||
|
title('Peak vs Chirp Rate');
|
||||||
|
legend('Reference','Comparison');
|
||||||
|
grid on;
|
||||||
|
|
||||||
|
% Plot relative error
|
||||||
|
figure;
|
||||||
|
rel_err = abs(peak_ref - peak_cmp) ./ peak_ref;
|
||||||
|
plot(betas/1e12, rel_err, 'o-', 'LineWidth', 1.5);
|
||||||
|
xlabel('\beta (MHz/\mus)');
|
||||||
|
ylabel('Relative Error');
|
||||||
|
title('Relative Error between Implementations');
|
||||||
|
grid on;
|
||||||
37
codegen_frft/bizinter.m
Normal file
37
codegen_frft/bizinter.m
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
function xint=bizinter(x)
|
||||||
|
|
||||||
|
N=length(x);
|
||||||
|
im = 0;
|
||||||
|
if sum(abs(imag(x)))>0
|
||||||
|
im = 1;
|
||||||
|
imx = imag(x);
|
||||||
|
x = real(x);
|
||||||
|
end
|
||||||
|
|
||||||
|
x2=x(:);
|
||||||
|
x2=[x2.'; zeros(1,N)];
|
||||||
|
x2=x2(:);
|
||||||
|
xf=fft(x2);
|
||||||
|
if rem(N,2)==1 %N = odd
|
||||||
|
N1=fix(N/2+1); N2=2*N-fix(N/2)+1;
|
||||||
|
xint=2*real(ifft([xf(1:N1); zeros(N,1) ;xf(N2:2*N)].'));
|
||||||
|
else
|
||||||
|
xint=2*real(ifft([xf(1:N/2); zeros(N,1) ;xf(2*N-N/2+1:2*N)].'));
|
||||||
|
end
|
||||||
|
if ( im == 1)
|
||||||
|
x2=imx(:);
|
||||||
|
x2=[x2.'; zeros(1,N)];
|
||||||
|
x2=x2(:);
|
||||||
|
xf=fft(x2);
|
||||||
|
if rem(N,2)==1 %N = odd
|
||||||
|
N1=fix(N/2+1); N2=2*N-fix(N/2)+1;
|
||||||
|
xmint=2*real(ifft([xf(1:N1); zeros(N,1) ;xf(N2:2*N)].'));
|
||||||
|
else
|
||||||
|
xmint=2*real(ifft([xf(1:N/2); zeros(N,1) ;xf(2*N-N/2+1:2*N)].'));
|
||||||
|
end
|
||||||
|
xint = xint + 1j*xmint;
|
||||||
|
end
|
||||||
|
|
||||||
|
xint = xint(:);
|
||||||
|
|
||||||
|
end
|
||||||
80
codegen_frft/fracF_cg.m
Normal file
80
codegen_frft/fracF_cg.m
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
function F = fracF_cg(f, a)
|
||||||
|
%#codegen
|
||||||
|
%% fracF_cg Fractional Fourier Transform (FrFT) - codegen-ready version
|
||||||
|
%
|
||||||
|
% Author: Canisio Barth
|
||||||
|
%
|
||||||
|
% F = fracF_cg(f, a) computes the Fractional Fourier Transform (FrFT)
|
||||||
|
% of the input signal 'f' for a single transform order 'a'.
|
||||||
|
%
|
||||||
|
% This version is adapted for MATLAB Coder and hardware-oriented workflows.
|
||||||
|
%
|
||||||
|
% Key characteristics:
|
||||||
|
% - Fixed input size: [1024 x 1] complex(single)
|
||||||
|
% - Output size: [512 x 1] complex(single)
|
||||||
|
% - Assumes input 'f' is already interpolated externally
|
||||||
|
% - No input validation (assumes valid scalar 'a' in core region)
|
||||||
|
% - Deterministic execution (no branching, no dynamic allocation)
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% f - [1024 x 1] complex(single)
|
||||||
|
% a - scalar single
|
||||||
|
%
|
||||||
|
% OUTPUTS:
|
||||||
|
% F - [512 x 1] complex(single)
|
||||||
|
%
|
||||||
|
% Notes:
|
||||||
|
% - Internal FFT size = 2048
|
||||||
|
% - Designed for code generation and future FPGA mapping
|
||||||
|
|
||||||
|
% Fixed sizes
|
||||||
|
N = 1024;
|
||||||
|
%N2 = 512;
|
||||||
|
Nfft = 2048;
|
||||||
|
|
||||||
|
% Ensure types
|
||||||
|
pi_s = single(pi);
|
||||||
|
|
||||||
|
% Transform parameter
|
||||||
|
phi = a * (pi_s / 2);
|
||||||
|
|
||||||
|
% Precompute trig terms
|
||||||
|
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 .* n) * tan_half_phi);
|
||||||
|
|
||||||
|
%% Chirp multiplication #1
|
||||||
|
g = Achirp .* f;
|
||||||
|
|
||||||
|
%% === Chirp B ===
|
||||||
|
m = single((-N:N-1).') / twoDelta;
|
||||||
|
|
||||||
|
Bchirp = exp(1j * pi_s * csc_phi .* (m .* m));
|
||||||
|
|
||||||
|
%% === Zero-padded buffer ===
|
||||||
|
g_pad = complex(zeros(Nfft,1,'single'));
|
||||||
|
g_pad(1:N) = g;
|
||||||
|
|
||||||
|
%% === FFT convolution ===
|
||||||
|
G = ifft( fft(g_pad) .* fft(Bchirp) );
|
||||||
|
|
||||||
|
%% Extract valid part and decimate
|
||||||
|
G_valid = G(N+1:2:end); % [512 x 1]
|
||||||
|
|
||||||
|
%% Complex phase constant
|
||||||
|
Aphi = sqrt(1 - 1j * cot_phi);
|
||||||
|
|
||||||
|
%% === Chirp multiplication #2 ===
|
||||||
|
F = (Aphi / twoDelta) .* G_valid .* Achirp(1:2:end);
|
||||||
|
|
||||||
|
end
|
||||||
77
codegen_frft/fracF_ref.m
Normal file
77
codegen_frft/fracF_ref.m
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
function [F] = fracF_ref(f, a)
|
||||||
|
%% fracF_ref Reference Fractional Fourier Transform (FrFT) implementation
|
||||||
|
%
|
||||||
|
% Author: Canisio Barth
|
||||||
|
%
|
||||||
|
% F = fracF_ref(f, a) computes the Fractional Fourier Transform (FrFT)
|
||||||
|
% of the input signal 'f' for a single transform order 'a'.
|
||||||
|
%
|
||||||
|
% This function serves as a reference (golden model) for validation and
|
||||||
|
% comparison against future code generation and hardware-oriented
|
||||||
|
% implementations.
|
||||||
|
%
|
||||||
|
% Key characteristics:
|
||||||
|
% - Scalar transform order 'a' (no vector support).
|
||||||
|
% - Assumes input signal 'f' is already interpolated externally.
|
||||||
|
% - Maintains original algorithm structure, including internal
|
||||||
|
% decimation after convolution.
|
||||||
|
% - Uses full MATLAB flexibility (not yet restricted for codegen).
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% f - Input signal, [N x 1] column vector.
|
||||||
|
% IMPORTANT: 'f' must already be interpolated (expanded signal).
|
||||||
|
%
|
||||||
|
% a - Scalar transform order.
|
||||||
|
% Expected to satisfy: 0.5 < |a| < 1.5
|
||||||
|
%
|
||||||
|
% OUTPUTS:
|
||||||
|
% F - Fractional Fourier Transform, [(N/2) x 1] column vector.
|
||||||
|
% (Decimated output, consistent with original algorithm.)
|
||||||
|
%
|
||||||
|
% LIMITATIONS:
|
||||||
|
% - No internal interpolation is performed.
|
||||||
|
% - Only valid for scalar 'a'.
|
||||||
|
% - Assumes caller enforces correct parameter range and signal format.
|
||||||
|
%
|
||||||
|
% See also: fracF (Ozaktas)
|
||||||
|
|
||||||
|
% Validate scalar 'a'
|
||||||
|
if ~isscalar(a)
|
||||||
|
error('Parameter ''a'' must be scalar.');
|
||||||
|
end
|
||||||
|
|
||||||
|
% Range check (core region)
|
||||||
|
if abs(a) < 0.5 || abs(a) > 1.5
|
||||||
|
error('Parameter ''a'' must be within the interval [0.5, 1.5].');
|
||||||
|
end
|
||||||
|
|
||||||
|
N = length(f); % already interpolated length
|
||||||
|
|
||||||
|
% Transform parameter
|
||||||
|
twoDelta = 2 * sqrt(N/2);
|
||||||
|
phi = a * pi / 2;
|
||||||
|
|
||||||
|
% === Chirp A ===
|
||||||
|
n = ((-N/2:N/2-1) / twoDelta).';
|
||||||
|
Achirp = exp(-1j * pi * (n .* n) * tan(phi/2));
|
||||||
|
|
||||||
|
% Chirp multiplication #1
|
||||||
|
g = Achirp .* f;
|
||||||
|
|
||||||
|
% === Chirp B ===
|
||||||
|
m = ((-N:N-1) / twoDelta).';
|
||||||
|
Bchirp = exp(1j * pi * csc(phi) .* (m .* m));
|
||||||
|
|
||||||
|
% === Chirp convolution ===
|
||||||
|
G = ifft(fft([g; zeros(N,1)]) .* fft(Bchirp));
|
||||||
|
|
||||||
|
% Extract valid part and decimate
|
||||||
|
G = G(end/2+1:2:end);
|
||||||
|
|
||||||
|
% Complex phase constant
|
||||||
|
Aphi = sqrt(1 - 1j * cot(phi));
|
||||||
|
|
||||||
|
% === Chirp multiplication #2 ===
|
||||||
|
F = (Aphi / twoDelta) .* G .* Achirp(1:2:end);
|
||||||
|
|
||||||
|
end
|
||||||
236
docs/img/resm_diagram.drawio
Normal file
236
docs/img/resm_diagram.drawio
Normal 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<div>Data clock = 128MHz</div><div>4 Samples/clock</div><div>BW = 512MHz</div><div>Interpolation = 8X</div><div>Fs = 4096MHz</div>" 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<div>Fs = 4096MHz</div><div>Decimation = 8X</div><div>BW = 512MHz</div><div>4 Samples/clock</div><div>Data clock = 128MHz</div>" 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<div>512 Samples</div>" 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<div>N frames of 512 samples</div>" 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="<div>DMA Engine</div><div>AXI-Stream to</div><div>&nbsp;AXI-MM</div>" 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<div>Memory Mapped</div><div>Registers</div>" 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="<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">Parameters</span><br><ul><li style="text-align: left;">Initialization</li><li style="text-align: left;">Configuration</li><li style="text-align: left;">Capture Control</li></ul>" 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="<div style="text-align: center;"><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">Data Processing</span></div><ul><li>DPW periodic read</li><li>Unpack samples</li><li>Convert to complex type</li><li>Reshape to DPW Matrix</li><li>Processing algorithm</li></ul>" 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="<font style="font-size: 14px;">CONTROL</font><div><font style="font-size: 14px;">CONFIG</font></div>" 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="<div><br></div><div><br></div>">
|
||||||
|
<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-<span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">IP</span>" 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="<div style="text-align: center;"><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">Parameters</span></div><ul><li>Constants</li><li>Switches</li><li>Slides</li><li>Gains</li></ul>" 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="<div style="text-align: center;"><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">Data Visualization</span></div><div><ul><li style="text-align: center;">Spectrum viewer</li><li>Array plot</li><li>Time scope</li></ul></div>" vertex="1">
|
||||||
|
<mxGeometry height="230" width="160" x="20" y="230" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
3
docs/img/resm_diagram.svg
Normal file
3
docs/img/resm_diagram.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 536 KiB |
144
docs/pl_rx_subsystem.md
Normal file
144
docs/pl_rx_subsystem.md
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# 📡 PL Rx Subsystem (Channelizer)
|
||||||
|
|
||||||
|
[🏠 Project Home](../README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
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 (or raw samples via bypass) and streams the result to the PS.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Channelizer Path (default)
|
||||||
|
|
||||||
|
ADC
|
||||||
|
↓
|
||||||
|
PFB Channelizer (Decimation + Filtering)
|
||||||
|
↓
|
||||||
|
FFT (512 bins)
|
||||||
|
↓
|
||||||
|
Capture (frame control)
|
||||||
|
↓
|
||||||
|
AXI4-Stream (128-bit, 4 samples/clock)
|
||||||
|
↓
|
||||||
|
DMA
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Bypass Path (Debug / Raw Data)
|
||||||
|
|
||||||
|
ADC
|
||||||
|
↓
|
||||||
|
Bypass Path
|
||||||
|
↓
|
||||||
|
Capture (frame control)
|
||||||
|
↓
|
||||||
|
AXI4-Stream (128-bit, 4 samples/clock)
|
||||||
|
↓
|
||||||
|
DMA
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Capture Pipeline
|
||||||
|
|
||||||
|
- Multi-frame acquisition (configurable nFrames)
|
||||||
|
- Frame size: 512 samples
|
||||||
|
- Supports asynchronous capture start (not frame-aligned)
|
||||||
|
- TLAST asserted at frame boundaries
|
||||||
|
|
||||||
|
### Behavior
|
||||||
|
|
||||||
|
- First frame may be partial
|
||||||
|
- Frames may contain ≤ 2 frame indices (expected)
|
||||||
|
- DPW spans nFrames frames but covers nFrames + 1 frame regions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Processing Chain (Channelizer Mode)
|
||||||
|
|
||||||
|
### ADC Input
|
||||||
|
- Sampling rate: 4096 MSPS
|
||||||
|
- Data type: **fixdt(1,16,15)** (Q1.15)
|
||||||
|
|
||||||
|
### PFB Channelizer
|
||||||
|
- Decimation: 8
|
||||||
|
- Effective bandwidth: 512 MHz
|
||||||
|
|
||||||
|
### FFT
|
||||||
|
- Size: 512
|
||||||
|
- Produces frequency bins
|
||||||
|
|
||||||
|
### Capture
|
||||||
|
- Defines frame boundaries (512 samples)
|
||||||
|
- Generates TLAST
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
- Width: 128 bits
|
||||||
|
- Contains 4 complex samples per cycle
|
||||||
|
- TLAST = frame boundary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Debug / Validation Features
|
||||||
|
|
||||||
|
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
|
||||||
|
- Deterministic latency
|
||||||
|
- High throughput (4 samples/clock)
|
||||||
|
- Dual-mode operation (channelizer / bypass)
|
||||||
|
- Validated up to nFrames = 1024
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Related Components
|
||||||
|
|
||||||
|
- [🏠 Project Home](../README.md)
|
||||||
|
- [PL Tx Subsystem](pl_tx_subsystem.md)
|
||||||
|
- [PS Subsystem](ps_subsystem.md)
|
||||||
177
docs/pl_tx_subsystem.md
Normal file
177
docs/pl_tx_subsystem.md
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
# 📡 PL Tx Subsystem (Pulse & Continuous LFM Generator)
|
||||||
|
|
||||||
|
[🏠 Project Home](../README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The Tx subsystem implements a **pulse-based and continuous Linear Frequency Modulated (LFM) chirp generator** using a DDS/NCO architecture in the FPGA (PL).
|
||||||
|
|
||||||
|
The generator produces **complex baseband output**:
|
||||||
|
|
||||||
|
x[n] = exp(j·φ[n])
|
||||||
|
|
||||||
|
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)
|
||||||
|
↓
|
||||||
|
Complex Output (I/Q)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Operating Modes
|
||||||
|
|
||||||
|
The subsystem now supports multiple Tx modes:
|
||||||
|
|
||||||
|
### 1. Pulsed LFM (default)
|
||||||
|
|
||||||
|
- Chirp generated only during pulse window
|
||||||
|
- Phase resets at each pulse start
|
||||||
|
- Standard radar burst operation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. CW Mode (Continuous Wave)
|
||||||
|
|
||||||
|
- `tx_active = 1` continuously
|
||||||
|
- Generates a single-tone output
|
||||||
|
- Achieved by setting constant phase increment
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Continuous LFM (Workaround Implementation)
|
||||||
|
|
||||||
|
- `tx_active` forced HIGH continuously
|
||||||
|
- A **1-cycle LOW pulse** is inserted periodically
|
||||||
|
- This LOW→HIGH transition **resets the NCO**
|
||||||
|
|
||||||
|
Result:
|
||||||
|
- Continuous chirp
|
||||||
|
- Bounded bandwidth
|
||||||
|
- Periodic repetition of LFM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Chirp Generation Principle
|
||||||
|
|
||||||
|
The chirp is generated using a second-order phase accumulator:
|
||||||
|
|
||||||
|
Δφ[n] = Δφ[n−1] + step
|
||||||
|
φ[n] = φ[n−1] + Δφ[n]
|
||||||
|
|
||||||
|
This results in a linear frequency sweep.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Parameterization (PS → PL)
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
|
||||||
|
- Center frequency: Fc
|
||||||
|
- Bandwidth: B
|
||||||
|
- Pulse width: N (samples)
|
||||||
|
|
||||||
|
Derived internally:
|
||||||
|
|
||||||
|
f_start = Fc − B/2
|
||||||
|
step = B / (N − 1)
|
||||||
|
|
||||||
|
These values are converted to DDS phase increments before being written to PL registers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pulse Timing (FSM)
|
||||||
|
|
||||||
|
States:
|
||||||
|
|
||||||
|
- IDLE: waits for trigger and latches parameters
|
||||||
|
- ACTIVE: generates pulses
|
||||||
|
- DONE: waits for trigger reset
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Timing Behavior
|
||||||
|
|
||||||
|
### Pulsed Mode
|
||||||
|
|
||||||
|
|<------ PRI ------>|
|
||||||
|
|<-- pulse -->| idle |
|
||||||
|
|
||||||
|
- tx_active = 1 → chirp output
|
||||||
|
- tx_active = 0 → output zero
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Continuous LFM Mode
|
||||||
|
|
||||||
|
tx_active behavior:
|
||||||
|
|
||||||
|
1 1 1 1 1 0 1 1 1 1 ...
|
||||||
|
|
||||||
|
- 1-cycle LOW inserted at end of chirp period
|
||||||
|
- Rising edge resets NCO
|
||||||
|
- Defines chirp repetition interval
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CW / Continuous LFM Implementation Details
|
||||||
|
|
||||||
|
- CW mode bypasses FSM output
|
||||||
|
- A dedicated counter generates periodic reset pulses
|
||||||
|
- Reset timing is based on `pulse_width_cycles`
|
||||||
|
|
||||||
|
Important:
|
||||||
|
|
||||||
|
- Reset pulse is exactly **1 clock cycle**
|
||||||
|
- Ensures deterministic NCO restart
|
||||||
|
- Decoupled from PRI/FSM timing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Burst Trigger (PS Interaction)
|
||||||
|
|
||||||
|
- Controlled via TxPulseStart (memory-mapped register)
|
||||||
|
- Rising edge triggers burst
|
||||||
|
- PL runs autonomously afterward
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Characteristics
|
||||||
|
|
||||||
|
- Deterministic timing (128 MHz)
|
||||||
|
- Efficient DDS (adder-based)
|
||||||
|
- Complex output (I/Q)
|
||||||
|
- Supports:
|
||||||
|
- Pulsed radar mode
|
||||||
|
- Continuous wave (CW)
|
||||||
|
- Continuous LFM (periodic chirp)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Design Notes
|
||||||
|
|
||||||
|
- FSM controls **timing (when to transmit)**
|
||||||
|
- NCO controls **frequency evolution**
|
||||||
|
- Continuous LFM implemented via **tx_active edge reuse**
|
||||||
|
- Minimal hardware overhead (no additional NCO logic)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Related Components
|
||||||
|
|
||||||
|
- [🏠 Project Home](../README.md)
|
||||||
|
- [PL Rx Subsystem](pl_rx_subsystem.md)
|
||||||
|
- [PS Subsystem](ps_subsystem.md)
|
||||||
294
docs/ps_subsystem.md
Normal file
294
docs/ps_subsystem.md
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
# 🧠 PS Subsystem (Control + Capture + Processing)
|
||||||
|
|
||||||
|
[🏠 Project Home](../README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The PS subsystem is responsible for:
|
||||||
|
|
||||||
|
* 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 & Initialization
|
||||||
|
|
||||||
|
* 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)
|
||||||
|
* Receives **128-bit stream** (4 samples per clock)
|
||||||
|
* Stores data in PS DDR memory
|
||||||
|
|
||||||
|
Configuration:
|
||||||
|
|
||||||
|
* Frame size: 512 samples
|
||||||
|
* nFrames: configurable (validated up to 1024)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data Format
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
|
* Triggered (event-based)
|
||||||
|
* Burst capture (DPW)
|
||||||
|
* Not continuous real-time streaming
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Performance Notes
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Role in System
|
||||||
|
|
||||||
|
The PS currently serves as:
|
||||||
|
|
||||||
|
* 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
|
||||||
|
|
||||||
|
### 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)
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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="aux" type="File"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="soc_rfsoc_prj_startup.m" type="File"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="soc_rfsoc_preload.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="post_processing" type="File"/>
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Info location="soc_rfsoc_startup.m" type="File"/>
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="soc_rfsoc_postload.m" type="File"/>
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
|
||||||
<Info Ref="" Type="Relative"/>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
|
||||||
<Info location="7ac7702b-30c0-47d0-8a3a-1562b67f2ab5" type="Reference"/>
|
|
||||||
@@ -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"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="codegen_frft" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="e5067e19-daed-4732-909a-6dc210e105d6" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="block_pulsegen" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="6a9c972f-52d5-42e0-8c82-940b26905df7" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="block_bypass" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="f7229047-4926-407b-902a-a25e790af1a9" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="docs/img" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="b625fd14-7cc4-44f4-ae1d-f8256f11241a" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="utilities/aux" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="ac65d1bc-e8fa-4056-83e4-eaba335b5aa3" type="Reference"/>
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Info Ref="referencedmodels" Type="Relative"/>
|
<Info Ref="referencedmodels" Type="Relative"/>
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Info location="15258b0d-3597-4917-9d8b-5ec7677aa528" type="Reference"/>
|
<Info location="15258b0d-3597-4917-9d8b-5ec7677aa528" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="block_capture" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="c26ab781-2c03-423c-8199-bc6903e4e4f7" type="Reference"/>
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Info Ref="utilities" Type="Relative"/>
|
<Info Ref="utilities" Type="Relative"/>
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Info location="082474f0-d7d9-423c-bb63-dc039b2ad79a" type="Reference"/>
|
<Info location="082474f0-d7d9-423c-bb63-dc039b2ad79a" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="docs" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="de23f5bc-2dc5-4828-b061-5d044a37a018" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="utilities/post_processing" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="5bfc0575-1eef-448a-a3a2-ced40deb5860" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="c2875307-deb1-4e40-b64d-d77c1eb908cb" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info description="RFSoC Channelizer + PS Processing (R-ESM Prototype) This project is based on the RFSoC SoC Blockset reference design, adapted as a prototype for a Radar Electronic Support Measures (R-ESM) receiver. The system implements a high-throughput signal chain in the FPGA (PL) and performs frame-based processing in the processor (PS)."/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="Information" type="Extension"/>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Info File="utilities/soc_rfsoc_startup.m" GroupUUID="default" Icon="" Name="soc_rfsoc_startup" Type="StartUp" Visible="0">
|
<Info File="utilities/soc_rfsoc_prj_startup.m" GroupUUID="default" Icon="" Name="soc_rfsoc_startup" Type="StartUp" Visible="0">
|
||||||
<Extension Name="StartUpPrev" Value="HEAD"/>
|
<Extension Name="StartUpPrev" Value="HEAD"/>
|
||||||
</Info>
|
</Info>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="TBm_pulsegen.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,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="resm_diagram.svg" 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="resm_diagram.drawio" 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/>
|
||||||
@@ -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,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/>
|
||||||
@@ -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="TBm_capture.slx" 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="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="TBc_fracFdpwLFM.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>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user