matlab中for循环的意外输出

时间:2017-08-26 21:12:40

标签: matlab for-loop

我正在尝试在matlab上执行以下代码我在一个函数内部有一个for循环,并且它应该在每次迭代时存储一个结果,但是当它执行时它只是给我结果最后一次迭代,代码序列有问题吗? inpit data1是一个大小为(33167 * 1)的数据向量 我怀疑foor循环有一些错误..有我写的代码:

function [vectorDominant] = processData(data1 , samplingRate , startRange, endRange)
  %(length(data)/1000)
data = data1;
windowSize = 10;
samplingRate = samplingRate;
frame_len = samplingRate*windowSize;
l = length(data);
num_frames = floor(l/frame_len);
t = 1;

    for i = 1 : num_frames  
                    frame = data( (i-1)*frame_len+1 : frame_len*i);

                    % --- haming window ------

                    hammingData=frame.*hamming(length(frame));

                    %---- remove dc offset from data ----

                    dataWindowed = detrend(hammingData);

                     % ---- apply fft ----


                     fourierTransform_data=fft(dataWindowed);
                     y = fourierTransform_data ;

                     %plot(abs(fourierTransform_data)) 



                     %------- find dominant-----


                 len = (length(frame)/2) -1;

                  y = y(1:len);
                  [v,k] = max(y);


                fftLength = length(frame);
                freq = (0:(samplingRate/fftLength) :(samplingRate/2));


                 %plot(freq,abs(y)), grid('on'), title('dominant freq')
                 freq =  freq(find(freq>=startRange & freq<=endRange));
                 dominantFrequency = freq(k);

                 %array[(length(data)/1000)];
                %var = 1;
                 %while var<= length(num_frames)
                     n = (length(data)/1000);

                     vectorDominant = zeros(n,1);  % to preallocate it first as it changes size every iterartion 
                     vectorDominant(i) = dominantFrequency;
                     %var = var+1;


                   %end



    end


end
  

我给它的参数是processData(ax,100,0.1,2),其中ax是   数据向量,它返回以下ans =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
0.2000
     

整个结果必须包含最后一个(0.2000)而不是零的数字

1 个答案:

答案 0 :(得分:1)

每次循环时,重新创建vectorDominant为零向量,然后将其中一个元素设置为新计算的值。据推测,在进入循环之前,应该完成以下前两行中的前两行。

n = (length(data)/1000);
vectorDominant = zeros(n,1);
vectorDominant(i) = dominantFrequency;

大概n也应该是num_frames,而不是上面计算的值。