Fixed-point conversion error of dsphdl.FFT

2 views (last 30 days)
I am trying to convert the below given matlab scripts to VHDL, but during fixed-point conversion it is showing that dsphdl.FFT is a non-tunable property and hence it cannot be converted as it needs a constant value. Is there any way around it as i need a code whose FFTLength can be changed as per need?
function [yOut, validOut] = HDLFFT(yIn, validIn, FFTLength)
persistent fftObj;
if isempty(fftObj)
fftObj = dsphdl.FFT('FFTLength', FFTLength);
end
[yOut, validOut] = fftObj(yIn, validIn);
end
the above is the main function
N = 1024;
Fs = 800000;
number_of_samples = 0:N-1;
time = (0:N-1)*Fs;
signal = cos(2*pi*200000*time);
sampled_signal = cos(2*pi*200000*number_of_samples/Fs);
signal_fixed = fi(sampled_signal,0,32,24);
signal_zeros = zeros(1, N);
validOut = false(1,N);
for loop = 1:1:3*N
if (mod(loop, N) == 0)
i = N;
else
i = mod(loop, N);
end
[signal_zeros(loop),validOut(loop)] = HDLFFT128_final((signal_fixed(i)),(loop <= N),FFTLength);
end
signal_zeros = signal_zeros(validOut == 1);
fft_reverse = bitrevorder(signal_zeros);
disp(fft_reverse);
figure(1)
stem(0:N-1,fft_reverse)
title('FFT')
the above is the testbench

Accepted Answer

Manikanta Aditya
Manikanta Aditya on 9 Jul 2024
Hi,
The issue you’re encountering is due to the fact that the dsphdl.FFT object in MATLAB requires a constant FFT length. This is because the FFT algorithm is implemented in hardware, and the FFT length directly affects the hardware architecture. Therefore, it cannot be changed dynamically during runtime.
Try out following workaround and see if you can resolve the issue:
  • You can create multiple FFT objects, each with a different FFT length. Then, based on the required FFT length, you can select the appropriate FFT object for processing. This approach will consume more resources as multiple FFT objects need to be instantiated.
Here is the workaround code:
function [yOut, validOut] = HDLFFT(yIn, validIn, FFTLength)
persistent fftObj;
if isempty(fftObj)
fftObj = cell(1, 1024); % Create a cell array to hold FFT objects
end
if isempty(fftObj{FFTLength})
fftObj{FFTLength} = dsphdl.FFT('FFTLength', FFTLength); % Create FFT object if it doesn't exist
end
[yOut, validOut] = fftObj{FFTLength}(yIn, validIn); % Use the appropriate FFT object
end
Hope this helps!

More Answers (0)

Products


Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!