- 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 ビュー (過去 30 日間)
古いコメントを表示
Jaykishan Solanki
2024 年 7 月 9 日
回答済み: Manikanta Aditya
2024 年 7 月 9 日
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 件のコメント
採用された回答
Manikanta Aditya
2024 年 7 月 9 日
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 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Transforms についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!