80 lines
1.9 KiB
Matlab
80 lines
1.9 KiB
Matlab
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 |