重新排序频率转换和抽取

信息处理 抽取 频率转换
2022-02-18 00:36:32

我试图了解两种不同的抽取和频率转换信号方法的行为。在这一点上,我只是交换翻译和抽取;我没有进行任何多速率处理。下图描述了基本思想。我在cf周围有一个线性相位滤波器。信号被转换(现在偏移量为 0)

shift = -cf + FsOut/4 + 偏移量

然后进行复数滤波,抽取到 FsOut/4,然后转换回实数。输入速率是输出速率的 2、4、8 或 16 倍。

窄带信号转换

我想我不妨通过重新排序过滤器和翻译抽取来加快速度。基本上是一样的,除了我将频率转换率乘以抽取因子。事实证明,当偏移量为零时,两种不同的方法会导致信号的位精确复制。注意我正在量化为 8 位。我相信当抽取比率为 16 且偏移量是 FsOut/8 的倍数时,这两种方法也可能相同或至少在某种程度上非常接近。

更一般地说,当偏移不为零时,时域信号是异相的,但我得到的功率谱大致相同。现在由于频率转换不是线性算子,在这种特殊情况下为什么我会得到相同的时域信号并不是很明显。我想也许碰巧发现这两种不同的方法之间存在简单的线性关系,所以我花了一些时间试图找到一个相位偏移作为偏移和抽取比的函数,这将使时域信号始终相同,但我什么都想不出来。我还尝试查看交叉频谱的相位,如果一个信号只是另一个信号的延迟副本,则它应该是一条线,但它仅适用于等于零的偏移量(显然因为它们是相同的)。

想了一会儿之后,我最好的猜测是,如果你把它写成一个多相结构,并用过滤器和抽取操作对翻译操作进行交换,那么在特殊情况下就会发生这种情况FsOut/4,频率转换可以一直推到最终总和(在取实部之后)。但是通常情况下,这两种不同的方法之间没有线性关系是正确的,还是我这里有问题?此外,实际上,有什么理由让我这样做很重要吗?我只是比较这两种方法以确保我做得正确。

编辑

我不能给出我的代码。但我可以尝试提供更多细节。此外,我刚刚意识到我忘记了方法 2 中的实际部分,但它似乎并没有改变任何东西。在方法 1 中,LPF (h) 以 FsOut/4 为中心。所以我们在 Matlab 中有类似下面的内容。

f0 = shift/fsIn*2*pi;
y = x .* exp(1j*(0:blen-1)*f0);
y = filter(h,1,y);
y = real(y(1:dec:end));

在方法 2 中,相同的过滤器位于 cf。我重新排序操作。

y = filter(h,1,x);
y = y(1:dec:end);
f0 = shift/fsIn*2*pi*dec;  % note decimation multiple
y = real(y .* exp(1j*(0:blen/dec-1)*f0));

重新表述这个问题,是否存在一个线性运算符,它采用方法 1 的输出并产生方法 2 的输出,偏移量不为零?我相信它只适用于如上所述的 FsOut/4。但我不确定...

编辑 2

也许将滤波器转换为高频存在问题?

-马克西米利安

你是对的。现在我有一些时间来看看这个,我发现它就是这么简单。事实上,根本不需要校正因子。我不知道为什么我没有看到两种方法之间的简单线性相位关系。在进行交叉光谱相位时,我可能做错了什么,或者可能与其他事情有关,例如量化问题。学过的知识。当我像您在帖子中所做的那样陷入困境时,我应该将我的模拟提炼成最简单的代码。

所以问题是我将上部过滤器转换为 fc 而不是(fc-offset)。正如您在上图中所见,黑线是两个过滤器的中心。红线是过滤发生的地方。上部滤波器的中心需要偏移偏移量,以便相位变化相同。

很容易计算引入的相位偏移。下图显示了单位延迟滤波器的线性相位斜率。使用我在评论中提供的过滤器,斜率为 640π/(FsIn/2)。因此校正因子为 exp(-i*640π/(FsIn/2)*offset)。当然,以这种方式解决问题是没有意义的,因为由于通带中的波纹,您仍然会遇到一些错误。如果您在相对于每个滤波器的中心频率完全相同的位置进行滤波,则唯一的误差应该是数值。

我还注意到,如果 shift 是 FsIn/(group delay) 的倍数(例如 1e6/640),即使存在偏移误差,也会发生非常小的误差。原因现在很明显;插入上面的指数,你得到 exp(-i*2π) == 1。误差可能是由于通带中的轻微幅度响应差异和/或可能是由于负正弦频率的阻带。我凭经验注意到的最后一件事;由于上部滤波信号的抽取和混叠没有相位变化 - 显然,或者如果没有相位校正,这将无法工作。

在此处输入图像描述

1个回答

在方法 2 中,您会遇到混叠问题:在对信号进行滤波后,它在带通区域的带宽为 FsOut/2。不过,您的采样频率是 FsIn,信号中的最大频率仍然是 Cf+FsOut/4。因此,如果您抽取到 FsOut,您会遇到混叠。这种混叠会在下采样信号的其他位置创建频谱的镜像。然后,在你的频移步骤中,你再次将这个频谱移动到某个地方并取实部。

我假设对于 off=0,您有一些用于 cf、FsIn 和 FsOut 的数字,它们的作用是使两种方法的频谱最终到达相同的位置。使用 off~=0,它只是没有。

所以,回答你的问题:这些,有一个线性运算符。该运算符是另一个频移(可以与您的第一个相结合),它将频谱移动到正确的频率。但是,在不知道数字的情况下,我们无法为您提供确切的解决方案。

从您的评论中获取值,我可以猜测以下内容:

FsIn = 1e6;
fc = 3e5;
f1 = fc;
f2 = fc+0.01e5;

t = 0:1/FsIn:0.1;


x = sin(2*pi*f1*t) + sin(2*pi*f2*t);


dec = 2;
FsOut = FsIn / dec;
offset = 1000;
shift = -fc + FsOut/4 + offset;

% method 1:
y = x .* exp(2j*pi*t*shift); % Downconvert
y1 = real(y(1:dec:end));     % Downsample

% method 2
y = x(1:dec:end);            % Downsample
y = y .* exp(2j*pi*t(1:dec:end)*shift);  % Downconvert. 
% (This equals multiplying the shift by dec, and just taking the first N/dec samples from t.)

y2 = real(y);

hold off;
plot(t(1:dec:end), y1, 'r-x');
hold on;
plot(t(1:dec:end), y2, 'b-o');

xlim([0.022, 0.0222]);

在此处输入图像描述

如您所见,两种方法都产生相同的信号。在这里,我省略了过滤,因为我不知道你使用什么过滤器。也许将滤波器转换为高频存在问题?