数字信道化(digital channelizer)以及DFT(FFT)的深入理解

本文探讨了数字信道化(digital channelizer)和DFT(FFT)在射电望远镜阵列数字波束合成中的应用。针对信道化中的频域混叠问题,文章介绍了传统的保护频带方法和无混叠滤波器设计。同时,阐述了DFT的本质是调制加权求和,并对比了信道化滤波器与FFT的混叠影响。通过对DFT和信道化的深入理解,有助于优化射电天文系统的性能。
摘要由CSDN通过智能技术生成

最近在给天文台做射电望远镜阵列数字波束合成(DBF)的系统方案设计,用到的通信算法无非正交变换(orthogonal transformation),滤波(filtering),DBF加权(weighted),数字信道化(digital channelizer),FFT等(目前两个主要方案)。这些算法虽然已经不止一次研究、甚至在FPGA中实现,上板调试外场调试过。但是这一段时间做方案还是对其有了更深入的理解。特别是对FFT(DFT)这里有了更深一些的感悟。

由头是在做信道化加窄带波束合成的宽带DBF方案时(这个是借鉴荷兰的LOFAR),对这个方案的性能做一些评估,这里主要误差引入在窄带波束合成的相位补偿失真和信道化的频域混叠。对于信道化的频域混叠,是一个很基本的问题,上次做的是检测类的应用,这个相关的文献介绍的比较多,比如注明James Tsui的《宽带数字接收机》里面有提到为了减少虚警,保证检测信号只可能落在相邻两个子信道内,对于信道化原型滤波器的设计采用通带频率范围和阻带频率范围相同的方式。举个例子,250MHz正交采样信号做256信道的数字信道化,对于原型滤波器的设计,通带250/256/2=0.4883MHz,阻带250/256=0.9766MHz。这里由于滤波器没法设计成理想的锐截止,因此频域混叠是一定会存在的,但是上述滤波器设计方式可以保证出现混叠的频率分量只在相邻两个子信道里,这样保证了检测信号只可能落在相邻两个子信道内,解决了虚警的问题。

在通信领域上信道化用的也比较多(通信领域改个名字叫OFDM),通信领域对混叠的解决方式略有不同。最开始的时候采用的是加入一些保护频带的方式来解决混叠的问题,在每两个相邻子信道之间设定一定带宽的保护频带,这时候滤波器设计过渡带落在保护频带

  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常抱歉,我之前的回答有误。根据您提供的错误信息,`cupyx.scipy.signal`模块没有名为`firwin2`的属性。为了在GPU上使用滤波器,我们可以使用CuPy提供的`cupyx.scipy.signal.firwin`函数。 请尝试使用以下修改后的代码: ```python import numpy as np import cupy as cp from cupyx.scipy import signal class Channelizer(object): """ Channelizer object. \param filter_coeffs: Filter coefficient array. """ _channel_num: int _filter_coeffs: np.ndarray def __init__( self, filter_coeffs: np.ndarray, channel_num: int = 8): assert isinstance(channel_num, int) self._filter_coeffs = np.reshape(filter_coeffs, (channel_num, -1), order='F') self._channel_num = channel_num @staticmethod def lfilter(coeff, data): output = cp.zeros(data.shape, dtype=complex) for i in range(data.shape[0]): output[i] = signal.lfilter(coeff[i], [1.0], data[i]) return output @staticmethod def fft(data): return cp.fft.fft(data, axis=0) @RunTime # 计算代码运行时间 def dispatch( self, data: np.ndarray ) -> np.ndarray: # Make the data length an integer multiple of the number of channels. disp_len = int(np.ceil(data.size / self._channel_num)) patch_size = int(disp_len * self._channel_num - data.size) patch_data = np.concatenate((data, np.zeros(patch_size))) reshape_data = np.reshape(patch_data, (self._channel_num, -1), order='F') polyphase_data = cp.flipud(cp.asarray(reshape_data)) nv = cp.arange(disp_len) prefilt_data = polyphase_data * ((-1) ** nv) # Polyphase filter bank filt_data = self.lfilter(self._filter_coeffs, prefilt_data) postfilt_data = cp.zeros(prefilt_data.shape, dtype=complex) for k in range(self._channel_num): postfilt_data[k] = filt_data[k] * ((-1) ** k) * cp.exp(-1j * np.pi * k / self._channel_num) dispatch_data = self.fft(postfilt_data) return cp.asnumpy(dispatch_data) ``` 在上述代码中,我们使用`cupyx.scipy.signal.lfilter`来应用滤波器。我们还更新了导入语句,以确保正确导入相关函数。 请注意,这只是一个修改建议,并不能保证一定能解决问题。如果问题仍然存在,请提供详细的错误信息和相关代码,以便我们能更好地帮助您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值