150 lines
8.0 KiB
Plaintext
150 lines
8.0 KiB
Plaintext
[1mdiff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m[m
|
||
[1mindex e06c41f..f09a03e 100644[m
|
||
[1m--- a/Classes/00_signals/Signal.m[m
|
||
[1m+++ b/Classes/00_signals/Signal.m[m
|
||
[36m@@ -172,11 +172,9 @@[m [mclassdef Signal[m
|
||
[m
|
||
hold on;[m
|
||
if isempty(options.color)[m
|
||
[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m
|
||
[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1);[m
|
||
[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m[41m
|
||
[m
|
||
else[m
|
||
[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m
|
||
[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Color',options.color);[m
|
||
[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m[41m
|
||
[m
|
||
end[m
|
||
% 2 c)[m
|
||
% - xlabel if not already here: time in readable format (1 ms and not 1e-3 s)[m
|
||
[1mdiff --git a/Classes/02_optical/DP_Fiber.m b/Classes/02_optical/DP_Fiber.m[m
|
||
[1mindex a5f3dce..c1f08ea 100644[m
|
||
[1m--- a/Classes/02_optical/DP_Fiber.m[m
|
||
[1m+++ b/Classes/02_optical/DP_Fiber.m[m
|
||
[36m@@ -24,6 +24,8 @@[m [mclassdef DP_Fiber[m
|
||
SS_dzmax % [m] max dz (adaptive SSFM)[m
|
||
SS_dzmin % [m] min dz (adaptive SSFM)[m
|
||
n_waveplates % number of PMD waveplates[m
|
||
[32m+[m[32m useGPU % GPU acceleration: true, false, or 'auto' (default)[m
|
||
[32m+[m[32m useSingle % Use single precision on GPU (default: false)[m
|
||
[m
|
||
% ---- Internal state (persistent between calls) ----[m
|
||
state % struct mirroring legacy 'state'[m
|
||
[36m@@ -56,6 +58,8 @@[m [mclassdef DP_Fiber[m
|
||
options.SS_dzmax = 2e4 % m[m
|
||
options.SS_dzmin = 100 % m[m
|
||
options.n_waveplates = 100[m
|
||
[32m+[m[32m options.useGPU = 'auto' % 'auto', true, or false[m
|
||
[32m+[m[32m options.useSingle = false % single precision GPU[m
|
||
end[m
|
||
[m
|
||
% Copy provided options into properties[m
|
||
[36m@@ -208,7 +212,7 @@[m [mclassdef DP_Fiber[m
|
||
% Frequency-dependent PMD phase term (legacy form)[m
|
||
st.brf.db0 = (R.rand(st.wave_plates,1)*2*pi - pi) * brf_multiplier;[m
|
||
st.brf.db1 = sqrt(3*pi/8)*(st.dgd/obj.fa)/st.wave_plates .* st.omega;[m
|
||
[31m- st.brf.simdgd = 0; [m
|
||
[32m+[m[32m st.brf.simdgd = 0;[m
|
||
% cumsum used in legacy only for debug; keep compatibility variable:[m
|
||
~cumsum(st.brf.db0); % no-op to mirror legacy path[m
|
||
[m
|
||
[36m@@ -228,7 +232,18 @@[m [mclassdef DP_Fiber[m
|
||
x_in = signal_in(:,1).';[m
|
||
y_in = signal_in(:,2).';[m
|
||
[m
|
||
[31m- [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state);[m
|
||
[32m+[m[32m % Determine GPU usage[m
|
||
[32m+[m[32m if ischar(obj.useGPU) || isstring(obj.useGPU)[m
|
||
[32m+[m[32m if strcmpi(obj.useGPU, 'auto')[m
|
||
[32m+[m[32m gpuFlag = []; % Let CNLSE_plain auto-detect[m
|
||
[32m+[m[32m else[m
|
||
[32m+[m[32m error('DP_Fiber:InvalidGPU', 'useGPU must be true, false, or ''auto''');[m
|
||
[32m+[m[32m end[m
|
||
[32m+[m[32m else[m
|
||
[32m+[m[32m gpuFlag = logical(obj.useGPU);[m
|
||
[32m+[m[32m end[m
|
||
[32m+[m
|
||
[32m+[m[32m [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state, gpuFlag, obj.useSingle);[m
|
||
[m
|
||
obj.state.propagated_length = obj.state.propagated_length + obj.state.L;[m
|
||
[m
|
||
[1mdiff --git a/Classes/02_optical/Optical_Demultiplex.m b/Classes/02_optical/Optical_Demultiplex.m[m
|
||
[1mindex 7d7c39e..8e272d2 100644[m
|
||
[1m--- a/Classes/02_optical/Optical_Demultiplex.m[m
|
||
[1m+++ b/Classes/02_optical/Optical_Demultiplex.m[m
|
||
[36m@@ -42,7 +42,7 @@[m [mclassdef Optical_Demultiplex < handle[m
|
||
[m
|
||
function signalclasses_out = process(obj, signalclass_in)[m
|
||
[m
|
||
[31m- % ---- Infer wavelength: either given or from input total signal [m
|
||
[32m+[m[32m % ---- Infer wavelength: either given or from input total signal[m
|
||
if isempty(obj.wavelengthplan)[m
|
||
obj.wavelengthplan = signalclass_in.lambda; %meter[m
|
||
else[m
|
||
[36m@@ -81,7 +81,7 @@[m [mclassdef Optical_Demultiplex < handle[m
|
||
obj[m
|
||
signal_in[m
|
||
end[m
|
||
[31m- [m
|
||
[32m+[m
|
||
w = obj.fs_out ./ obj.fs_in ;[m
|
||
blocklen_in = length(signal_in);[m
|
||
blocklen_out = w*blocklen_in;[m
|
||
[36m@@ -119,30 +119,31 @@[m [mclassdef Optical_Demultiplex < handle[m
|
||
N = size(lo,1);[m
|
||
C = size(lo,2);[m
|
||
[m
|
||
[31m- x_envelopes = zeros(N, C, 'like', signal_in);[m
|
||
[31m- y_envelopes = zeros(N, C, 'like', signal_in);[m
|
||
[32m+[m[32m % ---- VECTORIZED: Process all channels in parallel ----[m
|
||
[32m+[m[32m % Batched FFT operates on each column simultaneously on GPU[m
|
||
[m
|
||
[31m- s1 = signal_in(:,1);[m
|
||
[31m- s2 = signal_in(:,2);[m
|
||
[32m+[m[32m % Extract polarization signals[m
|
||
[32m+[m[32m s1 = signal_in(:,1); % X polarization [N×1][m
|
||
[32m+[m[32m s2 = signal_in(:,2); % Y polarization [N×1][m
|
||
[m
|
||
[31m- % Reusable work buffers (avoid reallocations)[m
|
||
[31m- wrk_time = zeros(N,1, 'like', signal_in);[m
|
||
[31m- wrk_freq = zeros(N,1, 'like', signal_in);[m
|
||
[32m+[m[32m % Broadcast signal to all channels and multiply with LO[m
|
||
[32m+[m[32m % s1, s2 are [N×1], lo is [N×C] → result is [N×C][m
|
||
[32m+[m[32m x_mixed = att .* s1 .* lo; % [N×C][m
|
||
[32m+[m[32m y_mixed = att .* s2 .* lo; % [N×C][m
|
||
[32m+[m
|
||
[32m+[m[32m % Batched FFT: each column computed in parallel[m
|
||
[32m+[m[32m x_freq = fft(x_mixed); % [N×C][m
|
||
[32m+[m[32m y_freq = fft(y_mixed); % [N×C][m
|
||
[32m+[m
|
||
[32m+[m[32m % Apply filter (H is [N×1], broadcasts across columns)[m
|
||
[32m+[m[32m x_filtered = x_freq .* H; % [N×C][m
|
||
[32m+[m[32m y_filtered = y_freq .* H; % [N×C][m
|
||
[32m+[m
|
||
[32m+[m[32m % Batched IFFT[m
|
||
[32m+[m[32m x_envelopes = ifft(x_filtered); % [N×C][m
|
||
[32m+[m[32m y_envelopes = ifft(y_filtered); % [N×C][m
|
||
[m
|
||
[31m- for c = 1:C[m
|
||
[31m- % ---- X branch ----[m
|
||
[31m- wrk_time(:) = att .* s1 .* lo(:,c); % N×1[m
|
||
[31m- wrk_freq(:) = fft(wrk_time); % N×1[m
|
||
[31m- wrk_freq(:) = wrk_freq .* H; % N×1[m
|
||
[31m- x_envelopes(:,c) = ifft(wrk_freq); % N×1[m
|
||
[m
|
||
[31m- % ---- Y branch ----[m
|
||
[31m- wrk_time(:) = att .* s2 .* lo(:,c);[m
|
||
[31m- wrk_freq(:) = fft(wrk_time);[m
|
||
[31m- wrk_freq(:) = wrk_freq .* H;[m
|
||
[31m- y_envelopes(:,c) = ifft(wrk_freq);[m
|
||
[31m- end[m
|
||
[31m- [m
|
||
end[m
|
||
end[m
|
||
end[m
|
||
[1mdiff --git a/Classes/02_optical/Optical_Multiplex.m b/Classes/02_optical/Optical_Multiplex.m[m
|
||
[1mindex 1d722b0..7fc8a33 100644[m
|
||
[1m--- a/Classes/02_optical/Optical_Multiplex.m[m
|
||
[1m+++ b/Classes/02_optical/Optical_Multiplex.m[m
|
||
[36m@@ -1,10 +1,10 @@[m
|
||
classdef Optical_Multiplex < handle[m
|
||
% Ta |