Abhinav Jain,欢迎来到 DSP 社区。
我为您构建了运行时比较的适当测试。
关于 MATLAB 计时的一些提示:
- 永远不要花时间在脚本中。总是调用一个函数来完成繁重的工作。当您从脚本运行某些内容时,它会在全局范围内运行,这意味着 MATLAB 无法像在函数中那样优化它。
- 对函数计时时,对测量进行几次迭代。我喜欢取这个迭代的中位数。其他人喜欢最低限度。通常平均值不好,因为它对异常值很敏感。
- MATLAB 是一种基于 JIT 的脚本语言。这意味着任何事情的第一次运行都需要更多时间。因此(2)是至关重要的。
- 注意 FFT / DFT 的结果很复杂。因此,当您为复杂数组分配内存时,您应该使用 -
vArrayName = complex(zeros(arrayLength, 1));
。
- 当您需要 MATLAB 中的虚数时,您应该使用or (不需要乘法)。当然你也可以使用。但是无需乘以,因为它可以帮助 JIT 引擎理解您的意思是虚数而不是变量。i=−1−−−√
1i
1j
5i
结果如下:
如您所见,确实 DFT 实现的运行时间表现为O(n^2)
.
代码如下:
%% Simulation Parameters
vNumSamples = 2:2:1024;
numIterations = 6;
%% Generate Data
mDftTime = zeros(numIterations, length(vNumSamples));
mFftTime = zeros(numIterations, length(vNumSamples));
for jj = 1:length(vNumSamples)
numSamples = vNumSamples(jj);
vX = randn(numSamples, 1);
for ii = 1:numIterations
hDftTimer = tic();
vXDft = ApplyDft(vX, numSamples);
mDftTime(ii, jj) = toc(hDftTimer);
hFftTimer = tic();
vXFft = fft(vX);
mFftTime(ii, jj) = toc(hFftTimer);
end
end
%% Run Time Analysis
vDftMedian = median(mDftTime).';
vFftMedian = median(mFftTime).';
vDftMean = mean(mDftTime).';
vFftMean = mean(mFftTime).';
vDftMax = max(mDftTime).';
vFftMax = max(mFftTime).';
vDftMin = min(mDftTime).';
vFftMin = min(mFftTime).';
%% Display Results
figureIdx = figureIdx + 1;
hFigure = figure('Position', figPosLarge);
hAxes = subplot(4, 1, 1);
% set(hAxes, 'NextPlot', 'add');
hLineSeries = plot(vNumSamples, [vDftMedian, vFftMedian]);
set(hLineSeries, 'LineWidth', lineWidthNormal);
% set(hLineSeries(2), 'LineStyle', ':');
set(get(hAxes, 'Title'), 'String', {['DFT vs. FFT Run Time - Median']}, ...
'FontSize', fontSizeTitle);
set(get(hAxes, 'XLabel'), 'String', {['Input Size']}, ...
'FontSize', fontSizeAxis);
set(get(hAxes, 'YLabel'), 'String', {['Run Time [Sec]']}, ...
'FontSize', fontSizeAxis);
hLegend = ClickableLegend({['DFT'], ['FFT']});
hAxes = subplot(4, 1, 2);
% set(hAxes, 'NextPlot', 'add');
hLineSeries = plot(vNumSamples, [vDftMean, vFftMean]);
set(hLineSeries, 'LineWidth', lineWidthNormal);
% set(hLineSeries(2), 'LineStyle', ':');
set(get(hAxes, 'Title'), 'String', {['DFT vs. FFT Run Time - Mean']}, ...
'FontSize', fontSizeTitle);
set(get(hAxes, 'XLabel'), 'String', {['Input Size']}, ...
'FontSize', fontSizeAxis);
set(get(hAxes, 'YLabel'), 'String', {['Run Time [Sec]']}, ...
'FontSize', fontSizeAxis);
hLegend = ClickableLegend({['DFT'], ['FFT']});
hAxes = subplot(4, 1, 3);
% set(hAxes, 'NextPlot', 'add');
hLineSeries = plot(vNumSamples, [vDftMax, vFftMax]);
set(hLineSeries, 'LineWidth', lineWidthNormal);
% set(hLineSeries(2), 'LineStyle', ':');
set(get(hAxes, 'Title'), 'String', {['DFT vs. FFT Run Time - Max']}, ...
'FontSize', fontSizeTitle);
set(get(hAxes, 'XLabel'), 'String', {['Input Size']}, ...
'FontSize', fontSizeAxis);
set(get(hAxes, 'YLabel'), 'String', {['Run Time [Sec]']}, ...
'FontSize', fontSizeAxis);
hLegend = ClickableLegend({['DFT'], ['FFT']});
hAxes = subplot(4, 1, 4);
% set(hAxes, 'NextPlot', 'add');
hLineSeries = plot(vNumSamples, [vDftMin, vFftMin]);
set(hLineSeries, 'LineWidth', lineWidthNormal);
% set(hLineSeries(2), 'LineStyle', ':');
set(get(hAxes, 'Title'), 'String', {['DFT vs. FFT Run Time - Min']}, ...
'FontSize', fontSizeTitle);
set(get(hAxes, 'XLabel'), 'String', {['Input Size']}, ...
'FontSize', fontSizeAxis);
set(get(hAxes, 'YLabel'), 'String', {['Run Time [Sec]']}, ...
'FontSize', fontSizeAxis);
hLegend = ClickableLegend({['DFT'], ['FFT']});
if(generateFigures == ON)
saveas(hFigure,['Figure', num2str(figureIdx, figureCounterSpec), '.png']);
end
正如您在上面的代码中看到的,我numIterations = 6
为每个样本数量运行每个算法。
然后,在时间数组上mDftTime
/mFftTime
我可以分析 Median / Mean / Min / Max 运行时间。
这是在 MATLAB 中分析函数运行时间的正确方法。
完整代码可在我的StackExchange Signal Processing Q51516 GitHub 存储库中找到。
备注
您正在 DSP 世界中迈出第一步,成为现代工程师的很大一部分是关于编程代码。
你应该花时间学习如何正确地编写代码和风格,以便你和你的合作伙伴容易理解和管理。
尝试从其他人的例子中学习。