我在 Matlab 中实现了示例 5.1.2“群延迟和衰减的影响”,我在 Alan Oppenheim 的离散时间信号处理第 3 版中找到。在本例中,3 个窄带信号(高, 低的和中频率),我将称之为音调,作为输入提供给具有正和负群延迟的 LTI 滤波器。该示例的目标是跟踪对系统输出中各个音调的影响。
尽管本书在这个例子中没有明确提到任何关于因果关系的内容,但我对因果系统案例很感兴趣。我已经修改了原始示例(参见代码),以在更广泛的频率范围内获得负群延迟我已经切换了输入顺序。负群延迟是通过在单位圆附近和周围放置零来实现的. 不幸的是,这会在输出端衰减这个频率。
从群延迟周围人们可能会认为,由于群延迟是一种测量延迟,因此负群延迟意味着信号可以在进入系统之前退出系统,这与因果关系相矛盾。
这是输入为中等时系统的输出(), 低的 () 和高 () 频率窄带信号的顺序:
认为高频的音调() 已经提前(移向时间原点),即使由于衰减我们看不到它?有点认为它已经以低频切换了位置()。即,具有中、低、高输入,输出为中、高、低。
这是一个非因果系统使用缓冲区造成因果关系,因为它使用高音之前的样本能够将其转移到那里?
如果首先放置高频音调,因为它无法移动到该位置之前,假设滤波器将施加延迟以执行因果滤波是否正确?
- 我已经看到,对于因果系统,全通系统会带来正的群延迟。是否有可能有一个具有负群延迟的因果稳定 LTI 滤波器?有没有可能它在这个波段附近没有接近零的幅度?
这篇文章说负群延迟并不意味着因果系统的时间提前。相反,对于群延迟为负的频带中的信号,滤波器会尝试预测输入。如果信号可以从过去的值预测,那么这会带来时间提前的错觉。但这并不是问题 4 的真正答案。
这是我的代码:
tiempo = 1:200;
tono1 = hamming(length(tiempo))'.*cos(0.2*pi*tiempo);
tono2 = hamming(length(tiempo))'.*cos(0.4*pi*tiempo - pi/2);
tono3 = hamming(length(tiempo))'.*cos(0.8*pi*tiempo + pi/5);
%original sequence from the example
%secuencia = [tono3 tono1 tono2 zeros(1,2*length(tiempo))] ;
%illustrative sequence
secuencia = [tono2 tono1 tono3 zeros(1,2*length(tiempo))] ;
figure
subplot(2,1,1)
plot(secuencia)
subplot(2,1,2)
plot(linspace(-pi,pi,length(secuencia)),abs(fftshift(fft(secuencia))))
% My modified system
Num = [0.0680369323869657,-0.148751468103317,-0.0840727385654123,0.433116714755249,0.194034734683412,-1.18139470037352,0.0865655483581989,1.87573223477322,-0.293287926967094,-2.71438209027864,0.967801050690298,2.73479750957294,-1.12373673157765,-2.50948341257372,1.33900328885438,1.60284621216217,-0.912031371991086,-0.934571172916517,0.623244740868535,0.316805565059412,-0.216878871699853,-0.101146864726266,0.0801206879869380];
Den = [1,-4.06364506017978,5.66323235132978,0.124350390160437,-7.36267038756774,1.97922786687038,11.0014898216757,-9.54873204176815,-5.37236943566056,9.75531866728175,0.420222506724089,-5.86926610519296,1.27627523253023,2.30928781145590,-1.18242719020123,0.106216188692196,-0.119037174950185,-0.0591088940098283,0.289996632822651,-0.260065787926090,0.248585836431488,-0.184399072803746,0.0647608900392396];
% Hd = dsp.IIRFilter('Numerator', Num, 'Denominator', Den);
% Hd = dfilt.df2t(Num, Den);
resultado = filter(Num,Den,secuencia);
figure
subplot(2,1,1)
plot(resultado)
subplot(2,1,2)
plot(linspace(-pi,pi,length(resultado)),abs(fftshift(fft(resultado))))