- 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.
Fixed-point conversion error of dsphdl.FFT
2 views (last 30 days)
Show older comments
Jaykishan Solanki
on 9 Jul 2024
Answered: Manikanta Aditya
on 9 Jul 2024
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
0 Comments
Accepted Answer
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:
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!
0 Comments
More Answers (0)
See Also
Categories
Find more on Transforms in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!