从FFT发现极值的区别

时间:2014-12-11 18:26:09

标签: matlab differentiation

我试图找到一个函数的零。请参阅下面的代码。

因为fft需要一个数值数组,所以我没有定义符号函数来使用fzero

但是,这种方法并不准确,取决于step。你有更好的主意吗?

step=2000;
x=0:pi/step:2*pi;
y= 4+5*cos(10*x)+20*cos(40*x)+cos(100*x);
fy = fft(y');
fy(1:8) =0;
fy(12:end-10)=0; 
fy(end-6:end)=0;
ffy = ifft(fy);
t=diff(ffy);
x=0:pi/step:2*pi-pi/step;
plot(x,t)
indices= find(t<5e-4 & t>-5e-4);

1 个答案:

答案 0 :(得分:2)

您可以继续数组t并查找值更改符号的点。这表明存在零。

实际上,MATLAB的fzero函数使用了类似的方法。你说你没有使用它,因为你需要一个数组,而不是一个匿名函数,但你可以使用简单的线性插值将数组转换为匿名函数,如下所示:

func = @(k) interp1(x,t,k);  % value of t(x) interpolated at x=k
fzero(func,initial_value);


编辑:只是为了澄清我的意思。如果您有一个数组t,并且想要找到它的零...

f = 5;                            % frequency of wave in Hz
x = 0:0.01:1;                     % time index
t = cos( 2*pi*f*x );              % cosine wave of frequency f

zeroList = [];                    % start with an empty list of zeros
for i = 2:length(t)               % loop through the array t

    current_t = t(i);             % current value of t
    previous_t = t(i-1);          % previous value of t

    if current_t == 0                  % the case where the zero is exact
        newZero = x(i);
        zeroList = [zeroList,newZero];
    elseif current_t*previous_t < 0    % a and b have opposite sign if a*b is -ve
        % do a linear interpolation to find the zero (solve y=mx+b)
        slope = (current_t-previous_t)/(x(i)-x(i-1));
        newZero = x(i) - current_t/slope;
        zeroList = [zeroList,newZero];
    end

end

figure(1); hold on;
axis([ min(x) max(x) -(max(abs(t))) (max(abs(t))) ]); 
plot(x,t,'b');
plot(x,zeros(length(x)),'k-.');
scatter(zeroList,zeros(size(zeroList)),'ro');

我得到的零是正确的:

enter image description here