如何使用 IFFT(用于 OFDM)将离散时间 QAM 脉冲转换为连续时间信号?

信息处理 fft 采样 OFDM IFFT
2022-02-22 08:01:29

所以我在尝试绘制 OFDM 信号的 PSD 时遇到了一些麻烦。具体来说,我看不出我们如何从离散域到时域连续。

我有一个时间向量,它以 10Khz 的速率采样,持续时间为 100 秒

t = 0:1/1e4:100

然后我通过以最大频率低通过滤一些噪声来生成信号

f_max = 50;                                              % maximum freq of message signal
x     = randn(size(t));                                  % Generate some noise
x     = filter2(fir1(10*ceil(f_s/f_max),2*f_max/f_s),x); % Low pass filter the noise
x     = x-mean(x);                                       % Remove any DC offset
x     = x/sqrt(mean(x.^2));                              % Normalise the signal

这是我的“时间连续”信号,然后以 8Hz 的速率对其进行采样,以通过时间离散信号给出

f_sample          = 8;
number_of_symbols = f_sample*t(end);
sample_indices    = round((0:number_of_symbols -1)*(length(x)-1)/(number_of_symbols -1))+1;
xSampled          = x(sample_indices);

然后在离散域中对其进行量化和 QAM 调制

xQuant = quantiz(xSampled,partition,codebook); % quantisation
xMod   = qammod(xQuant,M);                     % QAM modulation

这就是我的问题所在。OFDM 的下一步是使用 IFFT 将此频域表示转换为时间上的连续表示。但是假设我有FFT_Length= 64,我会将我的 QAM 调制信号分成 64 个长度向量number_of_symbols/64,这会给我 64 个向量,每个长度number_of_symbols/64,每个子载波一个 - 我们仍然在离散域中?

如果这是单载波方案,这是当 id 对 QAM 符号应用脉冲整形并将信号频率上采样到原始 10khz 时,但是在 OFDM 中不使用脉冲整形。我在想我们可以在 OFDM 调制之前通过在符号周期的剩余部分填充 0 来对 QAM 符号进行上采样,或者执行相同但填充 QAM 值,但是在这两种情况下,生成的 FFT 都像方波- 在一个符号周期内停留在一个值,然后立即切换到另一个值。

所以我的问题:

如何使用 IFFT(在 OFDM 中)将一系列 QAM 脉冲转换为连续时间信号

非常感谢 :-)

1个回答

您只需采用相同长度向量的 IFFT 即可获得时域信号。请注意,相对于每个子载波,每个 QAM“符号”都有多个样本。如果您希望插入更高的样本,则 FFT 应该在中心填充零,索引 N/2 处的共享 bin 中的值分成两半。对于一个简单的 6 bin 示例,请注意 bin 0 是 DC bin,bin 1 和 2 是正频率 bin,bin 3 是 Nyquist bin,bin 4 和 5 是负频率 bin,如下所述。这种方法将提供“完美”的插值,因为它将保持所有子载波正交性。

Bin Index          0     1     2    3    4    5
As pos/neg         0     1     2    N   -2   -1
Samples            x[0] x[1] x[2] x[3] x[4] x[5] 

这里插值到更高的采样率可以通过零插入正确完成,并按如下方式拆分奈奎斯特箱(如果已经非零)(我显示了 3 个零插入,但也可以是 6 个零以精确插值 2 个或更多零对于更高的插值因子:

Bin Index          0     1     2    3    4    5    6      7     8    9
As pos/neg         0     1     2    3    4    N   -4     -3    -2   -1
Samples            x[0] x[1] x[2] x[3]/2 0    0    0    x[3]/2 x[4] x[5] 

如果有奇数个样本,则不包括奈奎斯特 bin,在这种情况下,只会有 DC bin 0,后跟 “正频率轴”样本,然后是零插入,然后是最终的 $(N-1)/2“负频率轴”样本(不拆分奈奎斯特箱)。(N1)/2

IFFT 输出是在时域中传输的 OFDM 信号。为了观察传输的实际信号的功率谱密度,应在多个 OFDM 符号的持续时间内完成 FFT,每个符号都添加了循环前缀,然后将提供平均功率谱密度。另一种选择是使用 Welch 方法或其他类似的周期图,它们以牺牲分辨率带宽为代价来降低频谱中的噪声(频谱被多次创建,每个样本中的样本较少并被平均)。

import numpy as np
import scipy.fftpack as fft
import scipy.signal as sig
import matplotlib.pyplot as plt

def winfft(vec, fs=1., full_scale=1., beta=12., n_samp=None):
    '''
    vec: input signal
    fs: sampling rate (default 1)
    full_scale: normalization (default 1)
    beta: Kaiser window beta (default 12)
    n_samp: number of samples (default vec length)
    '''

    input_len = np.shape(vec)[0]
    if n_samp == None:
        n_samp = input_len
    elif n_samp < input_len:
        vec = vec[:n_samp]
    
    # only window data, not zero padded signal:
    win_len = input_len if n_samp > input_len else n_samp 

    win = sig.kaiser(win_len, beta)
    winscale = np.sum(win)
    win_data = win * vec 

    # scaled fft
    fout = 1./(winscale*full_scale) * fft.fft(win_data, n_samp)

    fout = fft.fftshift(fout)

    # create frequency axis
    faxis = np.array(range(n_samp)) * fs / n_samp - fs / 2

    return faxis, fout

以下是使用上面的零插入方法进行 2 内插后使用此函数绘制的具有 256 个 QAM 子载波的示例 OFDM 频谱:

OFDM