###### tags: `2021Ankang`
# 安康進度
## 11/18 安康會議
* 統一講 CFO, PHO,不要一人講PHO另一人講CPO,會造成誤解
* 投影片中需強調 atdma OQPSK 已整合,才不會讓人誤以為沒整合
# 11/17
## test 10 s data

## test 0.1s data




## test 0.8s data




# 11/11 紀錄
P. 1 期中報告->期末報告
P.3 上半年度->改成全年
P.5 成果交付項目 —> 要再加上期末報告書
p.13 "根據 sepc定義 "==> "sepc"改成 "spec"
p.17 "IPONIT" "IPIONT" --> 是否應為 "IPOINT"?
p. 30 "Butter filter" --> "Butterworth filter"
p. 35 "IPONIT", "IPIONT" --> 是否應為 "IPOINT"?
p.43~p.44: "好像有一頁多打?”那頁好像跳掉了?”
P. 16 可否畫圓一點
P.18 可否加一些文字描述尋到burst的peaks
P.41 理想值怎麼算?
p.47 Data conversion is done in 56 —> 也許不用強調(根本不用講)I/O (data conversion)的部分
-會再試一下 overlapadd method,可能可以改程式的寫法讓速度變快
-看能不能再減少CFOPHOTO estimation中用的迴圈 or 可能可以用較少點數去做match filter。(根據目前找到的cfo pho,看不出有規律)
# 11/10





# 11/9 晚上

剛剛發現CFOPHOTO_estimator中的迴圈數可再大幅精簡,
在我的mac上處理 0.1(sec) data 的時間由2.3(sec)減少至0.66(s)






# 11/9 下午
1. 減少CFOPHOTO_estimator中的迴圈
2. 將fftw and overlap add method 套用到安康code,但**目前用了overlap add method 後沒有比較快**
3. 目前在 HJS Lab computer時間 0.1s的資料從上禮拜的3.5 所減至 2.58(sec)
## 減少CFOPHOTO_estimator中的迴圈
### matlab
在 CFOPHOTO_estimator 中多加入判別

有此機制的時間:

無此機制的時間:

### C++
有此機制的時間:

無此機制的時間:

## fftw without overlapadd method
* The following simulation compute `y1 = filter(conj(q(end : -1 : 1)), 1, r)`
where `q` and `r` are all complex number
length( r ) = 532480
length( q ) = 858
* Simulation environment

* 
* result

## fftw with overlapadd method
* Simulation environment

* method





L = 900; % block size

## 目前在 HJS Lab computer時間
0.1s的資料跑 2.58(sec)




# 11/5
可成功在Ankang code上執行 overlap add method
problem: Lb太小時會segmentation fault

# 11/4
## 安康會議討論
11/11 9:00(線上):以預報形式報告
11/18 9:00(線上):期末審查預報(聽說會有長官來看)
11/25 9:00(線上or實體,中心還在討論)
關於real time,中心說原則上希望real time,但主要訴求還是希望C執行的結果是正確的(因為我提到精確度跟執行時間上有trade off)
* 在HJS lab computer用平行化處理看看時間能否壓低
* 看能否減少CFOPHOTO_estimator中的迴圈數=>減少conplex convolution的次數
* 用 overlap add method 看是否能加速(已經能在simple case上處理,但套到安康code時,目前遇到segmentation fault的問題,還在處理)
## 減少CFOPHOTO_estimator中的迴圈
### matlab
在 CFOPHOTO_estimator 中多加入判別

有此機制的時間:

無此機制的時間:

### C++
有此機制的時間:

無此機制的時間:

# 11/3
## 將resample的half-sided window length點數由6點調整為1點
* Simulation environment

* Sampling frequency: 6.25M Hz
* Test with 1M samples(約為0.1s的data)
* All process is done in 5.124441(sec)
* There are 22 bursts in total.






## Matlab
### overlap add method
* Finish overlap add method matlab code:
* 但目前用overlap add method時間並沒有執行比較快,請見下方模擬




**with matlab**
### convolution without overlap add method
* Test with the data in "coarseTO_estimator"
* Simulation environment


**result**

### convolution with overlap add method
* Test with the data in "coarseTO_estimator"
* Simulation environment


**result**

**with C**
### convolution without overlap add method
* Test with the data in "coarseTO_estimator"
* Simulation environment


**result**

## C
### Hjs Lab Computer
* 成功在蘇炫榮老師lab電腦上使用fftw並執行程式
* 目前0.1s的data需跑3.5s,請見下方模擬
* Simulation environment

* Sampling frequency: 6.25M Hz
* Test with 1.25M samples (相當於0.1s的訊號)
因為訊號為complex(包含實虛部data),所以需取 6.25M*2= 12.5M samples才為1s的data
* All process is done in 3.5(sec)[1.25M samples, 0.1s data]: 0.1s的data需跑3.5s
* There are 26 bursts in total.




# 11/2
## Matlab
* Simulation environment

* Sampling frequency: 6.25M Hz
* Test with 1M samples(約為0.1s的data)
* All process is done in 13.081393(sec)
* There are 22 bursts in total.




## C
* Simulation environment

### Test1
* Sampling frequency: 6.25M Hz
* **Test with 1M samples**(約為0.1s的data)
* All process is done in 3.516641(sec)
* There are 22 bursts in total.





### Test2
* Sampling frequency: 6.25M Hz
* **Test with 6.25M samples**
* All process is done in 19.895152(sec)
* There are 120 bursts in total. Here just show a few of them.


p.s.
* 實驗室電腦:Simulation environment

# 10/30
```問題已解決```
單一個迴圈demapping皆正確,但是跑大於一個burst後,demapping的值跑掉
跟cfo, pho, to estimation無關,估計的值已經很準
應該是記憶體的問題
發現兩個迴圈後,syncSig.size() = 0, 不知為何
迴圈外正常
cout << "L_syncSig" << L_syncSig << "\n"; // 858
cout << "syncSig_I.size()" << syncSig_I.size() << "\n"; //858
迴圈內
cout << "L_syncSig" << L_syncSig << "\n"; // 858
cout << "syncSig_I.size()" << syncSig_I.size() << "\n"; //0
346 行 syncSig_I.clear(); syncSig_Q.clear();不可clear掉因為迴圈中會用
但是
目前不clear & clear都有問題
# 10/28
安康會議紀錄:
* 完成SNR calculation, Symbol Error Rate計算
* 把訊號實際時間算出來 (也就是real-time可以處理的時間上限)
* 把處理的總時間 (1.16 sec, or 9.xxx sec) break down to 6 + 22 * 5 = 116 個時間,使得這116個時間加起來剛好等於總時間。如有需要,可以不事先print出來
* resample的部分可以考慮用 fftw來加速
* CFOPHOTO_estimator的 convolution,可以考慮用 overlap-add來加速
* 繼續維持 system block diagram 的呈現,使各項討論可以依照該diagram為中心來進行。
# 10/27
## C coding 技巧:
* ./d > test1.log
可以將由./d 執行檔執行出來的結果寫進.log檔中
* cat test1.log
可以在終端機上印出 test1.log 的值
* commmand + "/": slash => 加斜線
* 在viscode中,ctrl + F + match case + march whole world
* 養成好習慣:要用之前再allocate記憶體,用完之後馬上free
若用 fftw_alloc_complex(L)須補零
q = fftw_alloc_complex(Lz);
for(int i = 0; i < L_q; i++){
q[i][0] = p_flip_I[i]; q[i][1] = - p_flip_Q[i]; // conj(q(end : -1 : 1)
}
for(int i = L_q; i < Lz; i++){
q[i][0] = 0; q[i][1] = 0;
}
p_flip_I.clear(); p_flip_Q.clear(); //conj_p_flip_Q.clear();
p1 = fftw_plan_dft_1d(Lz, q, q_fft, FFTW_FORWARD, FFTW_ESTIMATE);// |FFTW_PRESERVE_INPUT);
fftw_execute(p1);
fftw_free(q);
# 10/26
* Github: [Ankang_OQPSK_C Github](https://github.com/WaitingLinComm/Ankang_OQPSK_C/tree/main/OQPSK_1026)
* [Ankang OQPSK Data 雲端連結](https://drive.google.com/drive/folders/1ty3S6nbTjD6RyVTkCJUxPCkhLBuK7SIt?usp=sharing)
p.s.因為data太大上傳不了github
main.cpp
使用第一個burst做測試
可解出正確的 cfo_hat, pho_hat, d
可demapping出正確的symbol
**problem:**
若直接讀取CFOPHOTO_estimator前的matlab資料,由CFOPHOTO_estimator
,可以解出正確的 cfo_hat, pho_hat, d,如下

但將所有block結合時,每次找出的cfo_hat, pho_hat, d值不同(有時正確有時錯誤),如下(有確認輸入CFOPHOTO_estimator的值無誤),感覺是記憶體配置的問題,但我試了很久還是無解

# 10/21

## Problem
用fftw執行一次convolution時,結果正確。但在迴圈中用fftw執行多次convolution,只有第一次的convolution結果正確。
後來發現問題應該是跟fftw記憶體配置相關,但我目前無法解決。
* 在我matlab code的 `CFOPHOTO_estimator` 中,會使用到iteration多次的convolution,所以需要處理這個問題
* 轉成C++時,我原以為是我程式打錯,但卡了很久才發現問題的根源是:在迴圈中用 fftw 的問題,請見下方的測試
## 以matlab測試下方程式
```
x = [1 + 1*j 2 + 2*j];
y = [3 + 3*j 5 + 4*j];
for i = 1:3
conv(x,y)
end
```
結果(正確):

---
## 以fftw測試
請參照 [我的 Github](https://github.com/WaitingLinComm/Ankang_OQPSK_C.git)中的 ./fft_iteration/test_easy_conv_iteration.cpp
結果(只有第一個iteration正確):

後來發現repeated calls to fft by using fftw3 would crash.
以下連結中也有人遇到類似問題
[Link1](http://computer-programming-forum.com/49-fortran/d2086ddd612b7596.htm)
[Link2](https://stackoverflow.com/questions/29761096/errors-with-repeated-fftw-calls)
[Link3](https://www.796t.com/post/NmdiYw==.html
)
## 我的嘗試:
### Try1 (成功)
[我的 Github](https://github.com/WaitingLinComm/Ankang_OQPSK_C.git)中的 ./fft_iteration/test_fft_iteration.cpp
我在每個迴圈中都計算相同的fft,每個迴圈印出的值都正確
發現:
* `fftw_plan p` 和 `fftw_destroy_plan(p)` 須放在迴圈外,否則會出現只有前幾次iteration值才正確
* 不能每個迴圈都執行 `fftw_free(out)` ,否則會出現只有前幾次iteration值才正確,最後一個迴圈再執行一次`fftw_free(out)` 才不會有問題
* 可以每個迴圈都執行 `fftw_free(in)`,結果正確
### Try2 (失敗)
[我的 Github](https://github.com/WaitingLinComm/Ankang_OQPSK_C.git)中的 ./fft_iteration/test_easy_conv_iteration.cpp
我在每個迴圈中都計算相同的convolution,只有前幾次iteration值才正確
**經過多方嘗試,仍無法正確執行**
### Try3(失敗)
在 `fftw_execute` 前後印出q

在 `fftw_execute` 前後印出fft(q, 3)

**情況與try2類似,只有第一次是正確的**
我嘗試
q = x = [1+1j 2+2j]長度為2,但想要做 三點 fft,怕後面的亂數導致影響,所以我將第三點 補0

算fft後變成這樣(似乎不受亂數影響,但是值差一點點就對了):

# 10/19 (問題已解決)
## Easy case for fftw3 implementation
Do fft of a complex vector
The result is correct.
The following code do: fft([1+i*1, 2+i*2], 4)
```
#include <stdio.h>
#include <fftw3.h>
int main()
{
int N = 4;
int i;
fftw_complex *in, *out;
fftw_plan p;
in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
// The input vector is [1+i*1, 2+i*2, 0, 0] in matlab language
in[0][0] = 1;
in[0][1] = 1;
in[1][0] = 2;
in[1][1] = 2;
// forward Fourier transform
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /*repeat as needed */
for (i = 0; i < N; i++)
printf("[%d]: %f + j*%f\n", i, out[i][0], out[i][1]);
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
return 0;
}
```
## 安康signal
**Problem**:
用fftw3 算出來的值,與用matlab算出來的值的不一樣,每個用fftw3 算出來的值與matlab的值皆差 0. 多,算出來的 two norm =419910922(與matlab的值比對)
**目前不知道為什麼會有數值誤差**
from matlab:

from C++:

下方為C++部分程式碼:
* 實現 fft(r, 533337)
* 下方主要執行步驟中有註解出所花費的時間
```
int Lz;
Lz = 533337;//L_r + L_q - 1;
// realize r_fft = fft(r, Lz);
fftw_complex *r;
fftw_complex *r_fft;
int P = Lz; // P point fft
r = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * P);
r_fft = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * P);
for(int i = 0; i < SigLength_afterResample; i++){
r[i][0] = Sig_I[i];
r[i][1] = Sig_Q[i];
} //0.02155(sec)
fftw_plan p;
p = fftw_plan_dft_1d(P, r, r_fft, FFTW_FORWARD, FFTW_ESTIMATE); //0.006094(sec)
fftw_execute(p); //0.021995(sec)
fftw_destroy_plan(p); //0.000133(sec)
fftw_free(r);
for (int i = 0; i < 10; i++){
printf("[%d]: %f + j*%f\n", i, r_fft[i][0], r_fft[i][1]);
}
```
# 20210719 進度紀錄

1. 整理先前在所學到的通訊系統相關概念,並整合在前幾個禮拜中由OQPSK中所學到的概念
* 筆記如下
a. Signal Space
https://drive.google.com/file/d/1UD45pfMJ_amEbNL7qY_FHUoljbpTpcBg/view?usp=sharing
b. PAM Tx/Rx, Nyquist criterion, ISI free, Raised Cosine filter, Squared Root Raised Cosine filter, matched filter design
https://drive.google.com/file/d/1a3O6G27rLFuFuQvEjyR20CYq3ebbUfcq/view?usp=sharing
2. 重寫程式中的Resample function(先前的code寫得很亂),並理解matlab parfor的用法
* 筆記如下
https://drive.google.com/file/d/1T-N1UCQcRBSXB0KbBvkOHdeRtjEWRd44/view?usp=sharing
進一步做法請參照目錄欄中的 Processing and Resample 小節
下方筆記中所提到的window size,我是先取window size = 6

3. 有關安康待做事項第四項 SNR, SER curve
* 完成QPSK, MPSK 錯誤率的相關推導
The following note includes SNR estimation, QPSK 錯誤率分析, M-ary 系統錯誤率分析, MPSK 錯誤率分析
https://drive.google.com/file/d/198nE3-7yUe_Pk4_SSx2LsNkir4BIXdb6/view?usp=sharing
* 問題:
用pilot估計$N_0$時,

若使用上方筆記的sol1,結果如下

若使用上方筆記sol2,結果如下

我覺得sol2的做法蠻合理,但似乎用sol1的結果比較正確,我不太確定究竟sol1, sol2哪個方法是對的(老師先前說sol1的方法與sol2的方法是等效的)
4. 有關安康待做事項第三項 Blind estimation of CFO/PHO/TO
目前我所列出的最佳化問題如下,不知是否合理

5. 當資料取多一些後,星座圖點還蠻亂的,可能會影響後續解出bit的結果,感覺很需要用Blind estimation of CFO/PHO/TO
模擬如下:
number of used data: 1e6
f_c= -338745;

number of used data: 2e6
f_c= -338745;
