[英]FFT: extract amplitude ratio when signal is not “straight”
我需要在積分過程中進行頻率分析,其中輸入為扭矩,輸出為位置。 如果輸入是正弦波,則輸出將變成這樣:
我用來提取振幅比和相位的代碼如下所示:
freq = 40;
freq_rad = freq * 2 * pi
phase_offset_rad = 30 * pi / 180
gain = 0
fs = 500;
L = 100;
t = (0:L-1)*(1/fs);
in = 2 * sin(freq * 2 * pi * t);
pos_in = [];
vel = 0;
pos = 0;
for i = 1:length(t)
vel = vel + in(i);
pos = pos + vel;
pos_in = [pos_in; pos];
end
out = pos_in;
%out = (2 + gain) * sin(freq * 2 * pi * t + phase_offset_rad);
fft_in = fft(in);
fft_out = fft(out);
[mag_in idx_in] = max(abs(fft_in));
[mag_out idx_out] = max(abs(fft_out));
phase = angle(fft_out(idx_out)) - angle(fft_in(idx_in))
phase_deg = phase / (pi / 180)
ratio = mag_out / mag_in
如果我在完全筆直的正弦信號上運行它,則它可以完美運行。 但是,一旦我添加了如上所述的失真,相位和幅度值都不正確。 我認為我需要以某種方式“拉平”信號。 但是我不確定如何從中提取正確的振幅。 振幅是多少? 我會在輸出中說,從一個“高原”到下一個“高原”之間的距離約為45,因為這是事情的發展程度。 那將是〜22.5的比率。 但是,計算結果為196。
也許我在想錯了嗎? 我想最終使用實驗數據從扭矩輸入到位置輸出導出傳遞函數。 也許有人可以展示如何做到這一點?
我一直在想,我能做的是記錄振幅比和相位,然后制作波德圖,並從中輕松提取出傳遞函數。 到目前為止,我無法從輸入頻率變化的運行測試中獲得波德圖。
因為FFT假設您對完美的周期信號(恰好是一個信號周期)進行頻率分析,所以fft(out)將包含很大的功率干擾(請參見“ 周期和移位定理” )。
我相信,在您的情況下,您可以通過執行一些系統修改來避免FFT分析失真。 除了估算系統的傳遞函數,您還可以估算系統+濾波器的傳遞函數。 也就是說,您必須將系統的輸出信號通過高通濾波器:
out = filter([1 -1], 1, out);
然后,您可以執行分析。
您可以通過freqz
函數估計濾波器的頻率響應(或者在我的情況下H = fft([1 -1], length(out));
僅H = fft([1 -1], length(out));
)。 然后,通過應用fft_out = fft_out ./ H(:);
逆響應,可以消除頻域中的濾波器影響fft_out = fft_out ./ H(:);
。 同樣,不要忘記取消第0個頻率fft_out(1) = 0;
在進行最大估算之前。
順便說一下,不同頻率的相位差估計看起來很奇怪(在您的代碼phase = angle(fft_out(idx_out)) - angle(fft_in(idx_in))
)。 看來您必須為彎角使用idx_in(或idx_out,取決於哪種估計更可靠)。
注意:此答案不是完整的指南,可能需要對現實生活進行一些改進。
PS嘗試將開窗應用於現實應用中的頻率響應估計(例如, 漢明窗 )。
PPS嘗試在https://dsp.stackexchange.com/上問您的問題
更新:在某些情況下,您可以忽略輸入信號的線性變換,而不是忽略濾波器的影響:in = filter([1 -1],1,in);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.