我用示波器捕获滤波器的输入信号,我正在尝试在滤波后计算信号。
所以我认为我做的是这个:
然而,它并不像我预期的那样完全正常。
为了得到真实的结果,我对IFFT的输入需要具有共轭对称性。因此,为了实现这一点,我的传递函数也需要具有共轭对称性。
为了达到这个目的,我创建了一个镜像频率向量,其中第二个减半 (由于负频率的传递函数将是正频率的结果的复共轭)。
IFFT的结果输出是真实的,但信号与我的测量结果不符。 (虚构部分实际上非常小,我认为浮点错误)
然而,如果我只是镜像我的频率向量(没有负频率),那么在转换到时域之后,信号的实部似乎与我的测量值相匹配。但在那种情况下,我扔掉了想象中的部分(这是 完全不是零,这似乎不对。所以我想知道这是不是巧合。
我已经用PSpice检查了传输函数的正确性,所以我知道它是正确的。
任何人都可以告诉我我的方法有什么问题吗?
% Input signal is in 'data'
% Sampling frequency
fs = 25e6;
% Create time vector
dt = 1/fs;
time = linspace(0,(length(data)-1)*dt,length(data))';
% FFT of sampled input data
data_fft = fft(data);
% Create frequency vector (for even number of samples)
freq = [ 0:length(data)/2 -(length(data)/2-1:-1:1) ] * fs/length(data);
% freq = [ 0:length(data)/2 (length(data)/2-1:-1:1) ] * fs/length(data);
freq = freq';
% Filter
C1 = 2.2e-6;
C2 = 2.2e-6;
L1 = 0;
rd = 1;
H = pi_filter(2*pi*freq, C1,C2,L1,rd);
% Apply filter
data_fft_filtered = data_fft .* H;
% Convert signal back to time domain
data_filtered = real(ifft(data_fft_filtered)); % Imag part should be zero.
pi_filter.m:
function gain=pi_filter(w, C1, C2, L1, rd)
a = -(C1 .* L1 .* w.^2 - 1) ./ ( (C1 .* L1 .* w.^2 - 1).^2 + w.^2 .* rd.^2 .* (C1 - C1.*C2.*L1.*w.^2 + C2).^2 );
b = ( -1 .* w .* rd .* (C1 - C1 .* C2 .* L1 .* w.^2 + C2)) ./ ( (C1 .* L1 .* w.^2 - 1).^2 + w.^2 .* rd.^2 .* (C1 - C1.*C2.*L1.*w.^2 + C2).^2 );
gain = complex(a,b);
end
修改:
我在评论中添加了pi_filter
函数的代码。
我还添加了一些输入信号的截图。 实际数据有点大(50mb),但是当我回到我的电脑上时,我可以将它上传到我的Dropbox,如果这样会有所帮助。
蓝色:输入信号,红色:计算输出信号,绿色:测量输出信号
这是我的滤波器(和传递函数)的频率(幅度和相位)响应。 红色图用于上面示例代码中使用的参数。