簡體   English   中英

FFT:當信號不是“直線”時提取幅度比

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM