寻找瞬时频率

时间:2014-03-24 17:30:57

标签: matlab frequency frequency-distribution

我想在信号窗口找到瞬时频率。我正在接收信号的一小部分并试图在该窗口中找到瞬时频率。但是该频率与信号的实际频率不匹配。以下是我的代码。

close all; clear all; clc

fs = 25000;
T = 0.5;
t = 0:1/fs:T;
n = length(t);

m = floor(n/4);
f1 = 100;
z1 = cos(2*pi*f1*t(1:m));

f1 = 200;
z2 = cos(2*pi*f1*t(1:m));

f1 = 300;
z3 = cos(2*pi*f1*t(1:m));

f1 = 400;
z4 = cos(2*pi*f1*t(1:(n-3*m)));

z = [z1 z2 z3 z4];

window = 100;
wStart = 1;
wEnd = wStart + window;
freqs = [];

while wEnd < length(z)
    x = z(wStart:wEnd);
    y = t(wStart:wEnd);

    h=hilbert(x);   
    unrolled_phase = unwrap(angle(h));

    dx = diff(unrolled_phase);
    dy = diff(y);
    p = dx./dy;
    inst_freq = p/(2*pi) + 2*pi;
    freqs = [freqs inst_freq];

    wStart = wEnd;
    wEnd = wStart + window;
end

&#39; freqs&#39;这是: plot(freqs)

我认为计算频率的方式有问题,但我不确定。有人可以帮忙吗?从代码中可以明显看出,我需要将频率仅为100,200,300和400。我想做的就是找到每个频率的起点(时间)

1 个答案:

答案 0 :(得分:0)

第一个理论上的答案是信号实际上是几个频率的组合。此外,如果您将信号分解为100 Hz的范围,其中包含100Hz,200Hz,300Hz等信号,那么您将无法将信号重新创建为完全相同的信号。也就是说,逆变换只能使用4个频率,并且会以一种方式组合,使得输入信号和恢复的信号听起来不一样!