通信中的同步(一)——基于FFT的信号信号载波频偏估计

https://blog.csdn.net/little_soldier/article/details/104878331?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160458535119724835854540%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160458535119724835854540&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-104878331.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E9%A2%91%E5%81%8F&spm=1018.2118.3001.4449


实际上,基于F F T FFTFFT的粗同步算法适用于各种调制方式。(BPSK, QPSK, 8PSK, PAM, or QAM调制)

基本算法见 Wang, Y., K. Shi, and E. Serpedi. "Non-Data-Aided Feedforward Carrier Frequency Offset Estimators for QAM Constellations: A Nonlinear Least-Squares Approach." EURASIP Journal on Applied Signal Processing. 2004:13, pp. 1993–2001

基于F F T FFTFFT的频偏估计算法如下:

Δ f ^ = f samp N ⋅ m arg ⁡ max ⁡ f ∣ ∑ k = 0 N − 1 r m ( k ) e − j 2 π k t / N ∣ , ( − R s y m 2 ≤ f ≤ R s y m 2 ) \Delta \widehat{f}=\frac{f_{\text {samp}}}{N \cdot m} \arg \max _{f}\left|\sum_{k=0}^{N-1} r^{m}(k) e^{-j 2 \pi k t / N}\right|, \quad\left(-\frac{R_{s y m}}{2} \leq f \leq \frac{R_{s y m}}{2}\right)Δf​=N⋅mfsamp​​argfmax​∣∣∣∣∣​k=0∑N−1​rm(k)e−j2πkt/N∣∣∣∣∣​,(−2Rsym​​≤f≤2Rsym​​)

其中,m mm是调制阶数(BPSK=2,QPSK=4,8PSK=8…), r ( k ) r(k)r(k)接收到的信号, R s y m R_{s y m}Rsym​ 为符号速率,N NN为FFT点数. 实际上,算法就是寻找序列r m ( k ) r^m(k)rm(k)的离散傅里叶变换的峰值谱线,其对应的频率即频偏的m倍。

现在的信号处理芯片,特别是FPGA,特别适用于F F T FFTFFT计算,因此,这种基于F F T FFTFFT的算法适用于工程实现。

Matlab仿真

Matlab已有函数comm.CoarseFrequencyCompensator完成这个算法。

下面我们以QPSK为例,按照算法来进行仿真,并且和comm.CoarseFrequencyCompensator的结果进行比较。

仿真参数设计

名称大小

Number of input symbols2048

Samples per symbol4

Sampling frequency (Hz)80000

mOrder4

代码部分参考Matlab的帮助文档。

clear;

clf;

close all;

% Compensate for Frequency Offset in a QPSK Signal

% Compensate for a 4 kHz frequency offset imposed on a noisy QPSK signal.

%

% Set the parameters.

nSym = 2048;      % Number of input symbols

sps = 4;          % Samples per symbol

nSamp = nSym*sps;  % Number of samples

fs = 80000;        % Sampling frequency (Hz)

mOrder = 4;

% Create a square root raised cosine transmit filter.

txfilter = comm.RaisedCosineTransmitFilter(...

    'RolloffFactor',0.2, ...

    'FilterSpanInSymbols',8,  ...

    'OutputSamplesPerSymbol',sps);

%

% Create a phase frequency offset object to introduce the 4 kHz frequency

% offset.

freqOffset = comm.PhaseFrequencyOffset(...

    'FrequencyOffset',4000, ...

    'SampleRate',fs);

% Generate QPSK symbols, filter the modulated data, pass the signal through

% an AWGN channel, and apply the frequency offset.

data = randi([0 mOrder-1],nSym,1);

modData = pskmod(data,mOrder,pi/mOrder);

txSig = txfilter(modData);

scatterplot(txSig)

title("过square root raised cosine transmit filter之后的信号")

rxSig = awgn(txSig,20,'measured');

offsetData = freqOffset(rxSig);

scatterplot(offsetData)

title("加入频偏之后的信号")

% 按照算法进行频偏估计

% 频率分辨率

fr = 1;

% 根据频率分辨率计算FFT点数

Nfft = 2^(floor(log2(fs/fr)));

% 计算FFT,取幅值

% 注意要对输入数据做mOrder的乘方运算将所有星座上的频偏都对应到一个值,即mOrder倍的频偏上

fftData = abs(fft(offsetData.^mOrder,Nfft));

% 作图

figure

plot(fftData);

% 寻找最大值

[maxVaule,maxIndex] = max(fftData);

% 将频率索引对应到-fs/2~fs/2上

if maxIndex>Nfft/2

    maxIndex = maxIndex - Nfft;

end

% 计算频偏。注意要除以mOrder,因为在计算FFT的时候,对输入数据进行了mOrder的乘方运算

estFreqOffset1 = fs/Nfft*(maxIndex-1)/mOrder

% compensate the FreqOffset to the signal

compensatedData1 = offsetData .*exp(2*pi*j*(-estFreqOffset1)/fs*(1:nSamp)');

% 做星座图

scatterplot(compensatedData1)

title("频率补偿之后的结果")

% 用matlab自带函数计算

% Create a coarse frequency compensator object to compensate for the offset.

freqComp = comm.CoarseFrequencyCompensator(...

    'Modulation','QPSK', ...

    'SampleRate',fs, ...

    'FrequencyResolution',1);

[compensatedData2,estFreqOffset2] = freqComp(offsetData);

estFreqOffset2

% 作图

scatterplot(compensatedData2)

title("Matlab自带函数频率补偿之后的结果")

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

仿真结果

结论

1.根据算法写出来的程序对频偏的估计和Matlab自带函数估计的频偏完全一致

2.在频偏估计出来之后,进行频率补偿后,从星座图中可以看出,消除了频偏带来的影响。

3.只是从星座图可以看出,本人代码的结果出现了一定的相位差,而Matlab自带函数没有这个相位差。这个问题待解决。

4.在通信接收机中,相位差问题也可以由后续的锁相环来解决。

最后

基于FFT的频偏估计方法能够很好地估计频偏,特别是在硬件条件(计算资源)允许的情况下,频偏估计的精度可以非常高。在通信接收机当中,是一种非常简便而且适用的粗同步方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354