2014-03-24 73 views
0

我想找到信號窗口上的瞬時頻率。我正在採集信號的一小部分,並試圖找到該窗口中的瞬時頻率。但該頻率與信號的實際頻率不匹配。以下是我的代碼。查找瞬時頻率

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 

「freqs」的情節是這樣的: plot(freqs)

我覺得有什麼不對的,我計算頻率,但我不知道的方式。任何人都可以幫忙嗎?我需要從代碼中看出,頻率只有100,200,300和400。我想要做的就是找到每個頻率的起始點(時間)

+0

您的hilbert功能不能正常工作,您認爲它應該可以正常工作。嘗試使用較低的採樣率(可能爲801 Hz)並使用平均濾波器對結果進行平滑 –

+0

希爾伯特變換不能正常工作的原因以及您希望當正弦波的希爾伯特變換具有恆定的幅度和恆定相位時改變,這個信號由正弦分段組成,所以在希爾伯特變換中存在瞬變。 –

回答

0

理論上的第一個答案是信號實際上是幾個頻率的組合。另外,如果您正在將信號分解爲100Hz,200Hz,300Hz等信號的範圍,那麼您將無法將信號重新創建爲完全相同的已轉換信號。也就是說,逆變換隻能使用4個頻率,並將以一種方式組合,使輸入信號和恢復信號聽起來不一樣!