SSB-SC解调及实现

发布时间 2023-10-21 13:32:52作者: 朱小勇

说明

根据《模拟调制解调通用过程》,假设IQ已经做了AFC。
SSB-SC表示单边带抑制载波,即调制信号中完全没有载波项,因为是通过IQ调制的。

IQ-USB

\[I=m(n)*cos(\delta\phi)-\hat{m(n)}^{}*sin(\delta\phi) \]

\[Q=m(n)*sin(\delta\phi)+\hat{m(n)}^{}*cos(\delta\phi) \]

其中\(\delta \phi\)为IQ与解调系统中的本地NCO的相位偏差。

IQ-LSB

\[I=m(n)*cos(\delta\phi)+\hat{m(n)}^{}*sin(\delta\phi) \]

\[Q=m(n)*sin(\delta\phi)-\hat{m(n)}^{}*cos(\delta\phi) \]

其中\(\delta \phi\)为IQ与解调系统中的本地NCO的相位偏差。

SSB解调说明

SSB解调一般有如下几种方式:
相干同步检测-synchronous detection(中频同步解调,SDR不支持),
移相法-phasing method(希尔伯特变换法),
维弗法-Weaver method(也叫third method),
滤波器法-filtering method(FFT滤波器)。

主要提供如下解调方式:

  • 移相法
  • 维弗法
  • 滤波器法

移相法

原理如图:
image

①移相法解调原理
将Q路信号进行希尔伯特滤波,将信号相位滞后90°,为了匹配Q路滤波器带来的延迟,I路进行同样的延时。
然后:如果是USB信号则用I-Q;如果是LSB信号则用I+Q。

② USB

  • IQ转三角表达式
    IQ因为:

\[I=m(n)*cos(\delta\phi)-\hat{m(n)}^{}*sin(\delta\phi) \]

\[Q=m(n)*sin(\delta\phi)+\hat{m(n)}^{}*cos(\delta\phi) \]

基带信号为:

\[m(n)=cos(2\pi f_m n+\phi_m) \]

\[\hat{m(n)}^{}=sin(2\pi f_m n+\phi_m) \]

故:

\[I=cos(2\pi f_m n+\phi_m+\delta\phi) \]

\[Q=sin(2\pi f_m n+\phi_m+\delta\phi) \]

  • 对Q做HT

\[HT(Q)=HT(sin(2\pi f_m n+\phi_m+\delta\phi))=-cos(2\pi f_m n+\phi_m+\delta\phi) \]

  • I-Q得到基带信号

\[I-Q=cos(2\pi f_m n+\phi_m+\delta\phi)+cos(2\pi f_m n+\phi_m+\delta\phi) \]

故:

\[USB=2*cos(2\pi f_m n+\phi_m+\delta\phi) \]

③ LSB

  • IQ转三角表达式
    IQ因为:

\[I=m(n)*cos(\delta\phi)+\hat{m(n)}^{}*sin(\delta\phi) \]

\[Q=m(n)*sin(\delta\phi)-\hat{m(n)}^{}*cos(\delta\phi) \]

基带信号为:

\[m(n)=cos(2\pi f_m n+\phi_m) \]

\[\hat{m(n)}^{}=sin(2\pi f_m n+\phi_m) \]

故:

\[I=cos(2\pi f_m n+\phi_m-\delta\phi) \]

\[Q=-sin(2\pi f_m n+\phi_m-\delta\phi) \]

  • 对Q做HT

\[HT(Q)=HT(-sin(2\pi f_m n+\phi_m-\delta\phi))=cos(2\pi f_m n+\phi_m-\delta\phi) \]

  • I+Q得到基带信号

\[I+Q=cos(2\pi f_m n+\phi_m-\delta\phi)+cos(2\pi f_m n+\phi_m-\delta\phi) \]

故:

\[LSB=2*cos(2\pi f_m n+\phi_m-\delta\phi) \]

④ 说明

  • 关于幅度补偿
    结果为\(cos(2\pi f_m n+\phi_m±\delta\phi)\)的2倍,这是移相法的优点:幅度补偿。由于某些中频NCO没有2倍的补偿,所以中频之后信号幅度衰减一半,移相法后幅度恢复到与基带信号一致;

  • 关于结果可行度
    为什么可以认为\(2*cos(2\pi f_m n+\phi_m±\delta\phi)\)就是恢复的基带信号呢?
    AFC之后,\(\delta\phi\)可能是恒定,也可能是细小变化的,这个值影响的是基带信号\(cos(2\pi f_m n+\phi_m)\)的相位变化,对于音频信号这影响可能会非常小。
    根据:https://www.dsprelated.com/blogs.php?searchfor=SSB
    可知4KHz带宽的音频信号,小于150Hz的频偏,人耳是可以容忍的。当频偏过大,音频将变形像“唐老鸭”的声音。
    然后这么大的频偏是无法通过AFC的,故对于音频信号而言,SSB是没什么压力的。

image

如图频偏小于0会让边带重叠,频偏大于0会让边带远离DC。

  • 关于I路信号
    执行了AFC之后的I路信号为:

\[I_{usb}=cos(2\pi f_m n+\phi_m+\delta\phi) \]

\[I_{lsb}=cos(2\pi f_m n+\phi_m-\delta\phi) \]

可以看到,这与经过了移相法之后恢复的信号差了2倍关系,所以即使不做移相法,我们直接取I路信号似乎就是我们想要的结果,所以移相法唯一的作用似乎就是对I路信号乘了2?
其实,除了移相法是同时利用了I、Q两路的数据,可以认为相比于只用I路数据,IQ都利用更能抗干扰。【个人理解,无参考依据】

  • 关于SSB与DSB的对比
    由于双边带里的相偏因素\(\delta \phi\)直接作用到了基带信号的幅度,
    AM:

\[I=[m(n)*index+A_0]*cos(\delta \phi) \]

\[Q=[m(n)*index+A_0]*sin(\delta \phi) \]

DSB:

\[I=[m(n)*index]*cos(\delta \phi) \]

\[Q=[m(n)*index]*sin(\delta \phi) \]

一旦这个频偏的为0或者趋近于0,那么基带信号无法被恢复,所以一定需要一些手段将其去掉,很幸运的是,我们根据双边带的特性,使用了一些PLL可以来实现这个目的。
然而:
SSB里的相偏因素\(\delta \phi\)是作用在基带信号的相位里的,这给信号的幅度变换带来了一定的缓冲,相偏变化后并不会像DSB那样立即影响到幅度;根据SSB的特性,我们似乎也无法找到合适的环来去掉这个相偏,只能通过同步技术AFC尽量使信号与接收机频率同步,以此来提高误码率。
然而对于其他对误码率要求高的通信方式,SSB是远没有双边带或频率调制表现好的,因为我们似乎永远无法消除这里的\(\delta \phi\)(不要陷入如何使用PLL去除偏移的牛角尖,因为根本不可能,这也是SSB可靠性低的原因)。
SSB不受欢迎的另一个原因就是解调电路太复杂了,正如这篇文章一样复杂。

例子1-refer from liquid

int FIRHILB(_c2r_execute)(FIRHILB() _q,
                          T complex _x,
                          T *       _y0,
                          T *       _y1)
{
    T * r;  // buffer read pointer
    T yi;   //
    T yq;   //

    if (_q->toggle == 0) {
        // push samples into appropriate buffers
        WINDOW(_push)(_q->w0, crealf(_x));
        WINDOW(_push)(_q->w1, cimagf(_x));

        // compute delay branch
        WINDOW(_index)(_q->w0, _q->m-1, &yi);

        // compute filter branch
        WINDOW(_read)(_q->w3, &r);
        DOTPROD(_execute)(_q->dpq, r, &yq);
    } else {
        // push samples into appropriate buffers
        WINDOW(_push)(_q->w2, crealf(_x));
        WINDOW(_push)(_q->w3, cimagf(_x));

        // compute delay branch
        WINDOW(_index)(_q->w2, _q->m-1, &yi);

        // compute filter branch
        WINDOW(_read)(_q->w1, &r);
        DOTPROD(_execute)(_q->dpq, r, &yq);
    }

    // adjust state
    _q->toggle = 1 - _q->toggle;

    // set return value
    *_y0 = yi + yq; // lower side-band
    *_y1 = yi - yq; // upper side-band
    return LIQUID_OK;
}

注意:以上代码主要是用FIR实现了希尔伯特滤波器。

例子1-refer from gnuraido

  • USB
    image

  • LSB
    image

link:https://jeremyclark.ca/wp/telecom/rtl-sdr-for-ssb-on-gnu-radio/
注意:grc里是将I路进行的希尔伯特,Q路没变,所以USB是加,LSB是减。

维弗法

原理如图:
image

link:https://wiki.gnuradio.org/index.php/Simulation_example:_Single_Sideband_transceiver

image

①维弗法解调原理
在本地产生中频频率为\(\frac{B_n}{2}\)的正交信号,\({B_n}\)为基带信号带宽,然后分别与IQ信号相乘后相加或相减就是DSB或LSB信号,对于音频信号,这个值常取1.5KHz。
这里主要推导过程,不结合SDR实现。
②实信号推导过程

  • 输入信号\(f_{rf}\)

\[f_{rf}=cos(\omega_ct+\omega_mt+\phi_n) \]

\(\omega_c\)为载波频率,\(\omega_m\)为基带信号频率,\(\phi_n\)为基带出相

  • 中频正交分解

\[f_1(t)=cos(\omega_ct+\omega_mt+\phi_n)*cos(\omega_st) \]

\[f_2(t)=cos(\omega_ct+\omega_mt+\phi_n)*sin(\omega_st) \]

  • LPF

\[f_3(t)=\frac{1}{2}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st) \]

\[f_4(t)=-\frac{1}{2}*sin(\omega_ct+\omega_mt+\phi_n-\omega_st) \]

  • 基带正交分解

\[f_5(t)=\frac{1}{2}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st)*cos(\omega_0t) \]

\[f_6(t)=-\frac{1}{2}*sin(\omega_ct+\omega_mt+\phi_n-\omega_st)*sin(\omega_0t) \]

三角变换后:

\[f_5(t)=\frac{1}{4}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st+\omega_0t)+ \frac{1}{4}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st-\omega_0t)\]

\[f_6(t)=\frac{1}{4}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st+\omega_0t)- \frac{1}{4}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st-\omega_0t)\]

  • 结果相加得到USB

\[USB=f_5(t)+f_6(t)=\frac{1}{2}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st+\omega_0t) \]

\[USB=\frac{1}{2}*cos(\omega_mt+\phi_n+\omega_ct-\omega_st+\omega_0t) \]

只需要调节\(\omega_s=\omega_c-\omega_0\),即可完全得到基带信号\(cos(\omega_mt+\phi_n)\)

  • 结果相减得到LSB

\[LSB=f_5(t)-f_6(t)=\frac{1}{2}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st-\omega_0t) \]

\[LSB=\frac{1}{2}*cos(\omega_ct+\omega_mt+\phi_n-\omega_st-\omega_0t) \]

只需要调节\(\omega_s=\omega_c+\omega_0\),即可完全得到基带信号\(cos(\omega_mt+\phi_n)\)

由于需要对于信号带宽进行估计,不一定适用于所有的调制信号,故不对这个方法展开。
link:WeaverDocument.pdf

滤波器法

image

这里也简单说明,不做实现。
Gnuradio里使用Freq-xlating-filter(频移滤波器)来将有频偏的SSB移动到DC,然后滤除带宽外的噪声,然后使用。
image

link:
滤波器法.pdf
http://www.csun.edu/~skatz/katzpage/sdr_project/sdr/grc_tutorial4.pdf

注意:由于SSB可靠性不是很好,一般要结合AGC使用