Added frft functions towards codegen (c code on PS)
This commit is contained in:
80
frft_codegen/fracF_cg.m
Normal file
80
frft_codegen/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
|
||||
Reference in New Issue
Block a user