├── .gitignore ├── .gitattributes ├── Script_ResampleSignal.m ├── Script_TxDataGeneration.m ├── Script_TxDataRetrieval.m ├── LICENSE.txt ├── Script_DataDelayTest.m ├── Script_Ex_LinearFFEqualization2.m ├── syncAndExtractSignal.m ├── Script_Ex_MLSEEqualization.m ├── Script_Ex_LinearFFEqualization.m ├── Script_50G_FFE_201802.m ├── Script_SequenceExtraction.m ├── decisionAndCalcBerPAM4.m ├── Script_playground.m ├── Script_50G_VolterraSOA.m ├── mlseEqualize.m ├── lowPassFilter25G.m ├── Script_50G_NoSOA.m ├── generateData.m ├── README.md ├── linearFFEqualize.m ├── Script_50G_SequenceExtraction.m ├── Script_RoF_Wireless_SquareLawDetection.m ├── Script_RoF_Wireless_CoherentDetection.m ├── Script_RoFWired.m ├── Script_PTLSim.m ├── volterraFFEqualize.m ├── bandPassFilter15G35G.m ├── bandPassFilter12G38G.m └── lowPassFilter12_5G.m /.gitignore: -------------------------------------------------------------------------------- 1 | Original Data/* 2 | Sampled Data/* 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /Script_ResampleSignal.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 28e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | FileDir = '.\Sampled Data\201710\28G_PAM4\obtb\'; 13 | files = dir([FileDir, 'extracted\']); 14 | 15 | for i = 1 : length(files) - 2 16 | SampledSignal = importdata([FileDir, 'extracted\', files(i).name]); 17 | ExtractedSignal = SampledSignal(1 : OverSamplingRatio : end); 18 | csvwrite([FileDir, 'extracted_1sps\', files(i).name], ExtractedSignal); 19 | end 20 | 21 | load splat 22 | sound(y,Fs) 23 | -------------------------------------------------------------------------------- /Script_TxDataGeneration.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | DataLength = 500000; 9 | NumOfSeq = 5; 10 | rng('shuffle'); 11 | PAM4Data = randi(4, DataLength, 1) - 1; 12 | PAM4Data = reshape(PAM4Data, DataLength / NumOfSeq, NumOfSeq); 13 | PAM8Data = randi(8, DataLength, 1) - 1; 14 | PAM8Data = reshape(PAM8Data, DataLength / NumOfSeq, NumOfSeq); 15 | PAM16Data = randi(16, DataLength, 1) - 1; 16 | PAM16Data = reshape(PAM16Data, DataLength / NumOfSeq, NumOfSeq); 17 | 18 | if ~exist('Original Data', 'dir') 19 | mkdir('Original Data'); 20 | end 21 | 22 | for i = 1 : NumOfSeq 23 | for j = [4, 8, 16] 24 | csvwrite(['Original Data\pam', num2str(j), '_', num2str(i), '.csv'], eval(['PAM', num2str(j), 'Data(:, ', num2str(i), ')'])); 25 | end 26 | end 27 | 28 | PAM4Data = PAM4Data / 3; 29 | PAM8Data = PAM8Data / 7; 30 | PAM16Data = PAM16Data / 15; 31 | -------------------------------------------------------------------------------- /Script_TxDataRetrieval.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | if ~exist('Original Data', 'dir') 9 | error('Original Data fold does not exist'); 10 | end 11 | 12 | DataLength = 500000; 13 | NumOfSeq = 5; 14 | PAM4Data = zeros(DataLength / NumOfSeq, NumOfSeq); 15 | PAM8Data = zeros(DataLength / NumOfSeq, NumOfSeq); 16 | PAM16Data = zeros(DataLength / NumOfSeq, NumOfSeq); 17 | 18 | for i = 1 : NumOfSeq 19 | for j = [4, 8, 16] 20 | switch j 21 | case 4 22 | PAM4Data(:, i) = importdata(['.\Original Data\pam4_', num2str(i), '.csv']); 23 | case 8 24 | PAM8Data(:, i) = importdata(['.\Original Data\pam8_', num2str(i), '.csv']); 25 | case 16 26 | PAM16Data(:, i) = importdata(['.\Original Data\pam16_', num2str(i), '.csv']); 27 | end 28 | end 29 | end 30 | 31 | PAM4Data = PAM4Data / 3; 32 | PAM8Data = PAM8Data / 7; 33 | PAM16Data = PAM16Data / 15; 34 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2017] [Peixuan Li] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Script_DataDelayTest.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | OSCRate = 80e9; 6 | DataRate = 28e9; 7 | SampleRate = lcm(OSCRate, DataRate); 8 | OverSamplingRatio = SampleRate / DataRate; 9 | 10 | SampledSignal = importdata('.\Sampled Data\50G PAM4\201708\cal\ebtb\C2ebtb00000.dat'); 11 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 12 | 13 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 14 | 15 | ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(SampledSignal), max(SampledSignal)]); 16 | step(ed, SampledSignal); 17 | 18 | tic 19 | OriginalSignal = importdata('.\Original Data\prbs15pam4.mat'); 20 | OriginalSignal = OriginalSignal'; 21 | OriginalSignal = (OriginalSignal - mean(OriginalSignal)) * 6; 22 | 23 | OriginalData_port1 = OriginalSignal; 24 | shiftnum = 61; 25 | % OriginalData_port2 = [~(OriginalSignal(shiftnum + 1 : end)); ... 26 | % ~(OriginalSignal(1 : shiftnum))]; 27 | OriginalData_port2 = [~(OriginalSignal(end - shiftnum + 1 : end)); 28 | ~(OriginalSignal(1 : end - shiftnum))]; 29 | % OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 30 | 31 | OriginalData = OriginalSignal; 32 | CorrelationResult = zeros(length(SampledSignal) - OverSamplingRatio * length(OriginalData) + 1, 1); 33 | parfor i = 1 : length(CorrelationResult) 34 | CorrelationResult(i) = sum(SampledSignal(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 35 | end 36 | plot(CorrelationResult) 37 | toc 38 | -------------------------------------------------------------------------------- /Script_Ex_LinearFFEqualization2.m: -------------------------------------------------------------------------------- 1 | %% This example shows how to equalize all the dat file in the same directory 2 | %% and then draw a ber plot for the dat files with 1 points a file. 3 | 4 | % TODO The ber plot is not done yet 5 | 6 | clear all; 7 | close all; 8 | clc; 9 | 10 | %% change the current directory to the folder which contains this m file 11 | cd(fileparts(which(mfilename))); 12 | 13 | %% Generate original data 14 | OriginalData = generateData(); 15 | 16 | %% Import sampled data from DSO 17 | % Defining parameters 18 | SampleRate = 400e9; 19 | DataRate = 12.5e9; 20 | OverSamplingRatio = SampleRate / DataRate; 21 | % importing and eyediagram drawing 22 | SampleDir = '.\Sampled Data\40km+FBG+FILTER+0\'; 23 | files = dir(SampleDir); 24 | for i = 1 : length(files) - 2 25 | SampledSignal = importdata(strcat(SampleDir,files(i + 2).name)); 26 | % eyediagram(SampledSignal(1:100000), 4*OverSamplingRatio, 2*OverSamplingRatio, 0.5*OverSamplingRatio); 27 | % grid on; 28 | 29 | %% Signal Synchronization and Extraction 30 | [ExtractedSignal(:,i), OriginalSignal(:,i)] = syncAndExtractSignal(SampledSignal, OriginalData, OverSamplingRatio); 31 | 32 | %% LMS Equalization 33 | % 101-tap FFE and training for 20 epochs 34 | [equalizedSignal(:,i), w] = linearFFEqualize(ExtractedSignal(:,i), OriginalSignal(:,i), 'lms', 101, 0.01, 20); 35 | % Equalization Result Visulization 36 | % eyediagram(equalizedSignal, 4*OverSamplingRatio, 2*OverSamplingRatio, 0.5*OverSamplingRatio); 37 | % grid on; 38 | 39 | %% Signal Decision and BER Calculation 40 | [BitErrorRate(i), SymErrorRate(i), BitErrorNum(i)] = decisionAndCalcBerPAM4(equalizedSignal(:,i), (OriginalSignal(:,i) + 3) / 2); 41 | fprintf('The %d th Bit eror numbers: %d \n', i, BitErrorNum(i)); 42 | fprintf('SER: %e\n', SymErrorRate(i)); 43 | fprintf('BER: %e\n\n', BitErrorRate(i)); 44 | end 45 | plot(log10(BitErrorRate)) -------------------------------------------------------------------------------- /syncAndExtractSignal.m: -------------------------------------------------------------------------------- 1 | function [ExtractedSignalUS, OriginalSignalUS] = syncAndExtractSignal(SampledData, OriginalData, OverSamplingRatio, UpSamplingRatio) 2 | % This function performs the synchronization and signal extraction for the 3 | % sampled signal from DSO. The %SampledData% will be down sampled by the 4 | % %OverSamplingRatio%/%UpSamplingRatio% and correlated with the %OriginalData% 5 | % upsampled by %UpSamplingRatio%. Then the index of max correlating coeffients 6 | % will be found and the synchronized data will be extracted. 7 | % 8 | % input: 9 | % SampledData 10 | % The data sampled by DSO. 11 | % OriginalData 12 | % The data which is transmitted with 1 symbol per second. 13 | % OverSamplingRatio 14 | % The ratio of down sampling progress, which is usually the DSO sample 15 | % rate dividing signal symbol rate 16 | % UpSamplingRatio (optional) 17 | % The ratio of up sampling progress. 18 | % Default value: 1 19 | % output: 20 | % ExtractedSignalUS 21 | % The synchronized and extracted signal upsampled by %UpSamplingRatio%. 22 | % Size: length(OriginalData)*UpSamplingRatio, 1 23 | % OriginalSignalUS 24 | % The original signal upsampled by %UpSamplingRatio%. 25 | % Size: length(OriginalData)*UpSamplingRatio, 1 26 | 27 | % Parameters checking 28 | narginchk(3,4); 29 | 30 | if ~exist('UpSamplingRatio','var') || isempty(UpSamplingRatio) 31 | UpSamplingRatio = 1; 32 | end 33 | 34 | % Downsampling 35 | % TODO Change the mechanism of sync; There are some bugs here 36 | DownSampledData = SampledData(1:OverSamplingRatio/UpSamplingRatio:end, 1); 37 | 38 | % Preparing transmitted data 39 | OriginalDataRemapped = (OriginalData - 1.5) * 2; 40 | OriginalSignalUS = reshape(repmat(OriginalDataRemapped, 1, UpSamplingRatio)', UpSamplingRatio * numel(OriginalDataRemapped), 1); 41 | 42 | % Correlation 43 | CorrelationResult = conv(DownSampledData(1:end), conj(OriginalSignalUS(end:-1:1))); 44 | [MaxCorr, index] = max(CorrelationResult); 45 | 46 | ExtractedSignalUS = DownSampledData(index-length(OriginalData)*UpSamplingRatio+1 : index); 47 | -------------------------------------------------------------------------------- /Script_Ex_MLSEEqualization.m: -------------------------------------------------------------------------------- 1 | %% This example shows the work flow for a receiver side dsp: data generation, 2 | %% synchronization, signal extraction, PAM4 decision and BER calculation. 3 | %% Also the eyediagram is drawn, but since the equalizer is 1 sample/sym, 4 | %% the equalized signal eyediagram cannot be drawn. What's more, the error 5 | %% performance of signal before and after equalization is compared. 6 | %% Equalization step uses MLSE equalizer. 7 | 8 | clear all; 9 | close all; 10 | clc; 11 | 12 | %% change the current directory to the folder which contains this m file 13 | cd(fileparts(which(mfilename))); 14 | 15 | %% Generate original data 16 | OriginalData = generateData(); 17 | 18 | %% Import sampled data from DSO 19 | % Defining parameters 20 | SampleRate = 400e9; 21 | DataRate = 12.5e9; 22 | OverSamplingRatio = SampleRate / DataRate; 23 | % importing and eyediagram drawing 24 | SampledSignal = importdata('.\Sampled Data\40km+FBG+FILTER+-680\F2_00011.dat'); 25 | eyediagram(SampledSignal(1:100000), 4*OverSamplingRatio, 2*OverSamplingRatio, 0.5*OverSamplingRatio); 26 | grid on; 27 | 28 | %% Signal Synchronization and Extraction 29 | [ExtractedSignal, OriginalSignal] = syncAndExtractSignal(SampledSignal, OriginalData, OverSamplingRatio); 30 | 31 | %% MLSE Equalization 32 | [EqualizedSignal, ChnlCoeffs, costs] = mlseEqualize(ExtractedSignal, OriginalSignal, 4); 33 | 34 | % plot the curve of convergence 35 | figure; 36 | plot(costs); 37 | title('Curve of Convergence'); 38 | xlabel('Epoch'); ylabel('Cost'); 39 | 40 | %% Signal Decision and BER Calculation 41 | % For the unequalized signal 42 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalSignal); 43 | fprintf('\nThe signal error before equalization\n'); 44 | fprintf('Bit number num: %d \n', BitErrorNum); 45 | fprintf('SER: %e\n', SymErrorRate); 46 | fprintf('BER: %e\n', BitErrorRate); 47 | 48 | % For the equalized signal 49 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalSignal); 50 | fprintf('\nThe signal error after equalization\n'); 51 | fprintf('Bit number num: %d \n', BitErrorNum); 52 | fprintf('SER: %e\n', SymErrorRate); 53 | fprintf('BER: %e\n', BitErrorRate); 54 | -------------------------------------------------------------------------------- /Script_Ex_LinearFFEqualization.m: -------------------------------------------------------------------------------- 1 | %% This example shows the work flow for a receiver side dsp: data generation, 2 | %% synchronization, signal extraction, PAM4 decision and BER calculation. 3 | %% Also the eyediagram is drawn, but since the equalizer is 1 sample/sym, 4 | %% the equalized signal eyediagram cannot be drawn. What's more, the error 5 | %% performance of signal before and after equalization is compared. 6 | 7 | clear all; 8 | close all; 9 | clc; 10 | 11 | %% change the current directory to the folder which contains this m file 12 | cd(fileparts(which(mfilename))); 13 | 14 | %% Generate original data 15 | OriginalData = generateData(); 16 | 17 | %% Import sampled data from DSO 18 | % Defining parameters 19 | SampleRate = 400e9; 20 | OSCRate = 80e9; 21 | DataRate = 25e9; 22 | OverSamplingRatio = SampleRate / DataRate; 23 | % importing and eyediagram drawing 24 | SampledSignal = importdata('.\Sampled Data\20170428\ebtb.txt'); 25 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 26 | eyediagram(SampledSignal(1:100000), 4*OverSamplingRatio, 2*OverSamplingRatio, 0.5*OverSamplingRatio); 27 | grid on; 28 | 29 | %% Signal Synchronization and Extraction 30 | [ExtractedSignal, OriginalSignal] = syncAndExtractSignal(SampledSignal, OriginalData, OverSamplingRatio); 31 | 32 | %% LMS Equalization 33 | % 101-tap FFE and training for 5 epochs 34 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalSignal, 'lms', 1001, 0.001, 5); 35 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalSignal, 'rls', 301, 0.99, 2); 36 | 37 | % plot the curve of convergence 38 | % figure; 39 | % plot(costs); 40 | % title('Curve of Convergence'); 41 | % xlabel('Epoch'); ylabel('Cost'); 42 | 43 | %% Signal Decision and BER Calculation 44 | % For the unequalized signal 45 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalSignal); 46 | fprintf('\nThe signal error before equalization\n'); 47 | fprintf('Bit number num: %d \n', BitErrorNum); 48 | fprintf('SER: %e\n', SymErrorRate); 49 | fprintf('BER: %e\n', BitErrorRate); 50 | 51 | % For the equalized signal 52 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalSignal); 53 | % fprintf('\nThe signal error after equalization\n'); 54 | % fprintf('Bit number num: %d \n', BitErrorNum); 55 | % fprintf('SER: %e\n', SymErrorRate); 56 | % fprintf('BER: %e\n', BitErrorRate); 57 | -------------------------------------------------------------------------------- /Script_50G_FFE_201802.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 25e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | FileDir = '.\Sampled Data\201801\O-band DML\40G PD\obtb\'; 13 | 14 | % TODO import data 15 | 16 | 17 | % BER counting 18 | [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 19 | fprintf('The signal error before equalization\n'); 20 | fprintf('Bit error num: %d\n', BitErrorNum); 21 | fprintf('SER: %e\n', SymErrorRate); 22 | fprintf('BER: %e\n', BitErrorRate); 23 | 24 | % EQ and BER counting 25 | tic 26 | ChannelLen = 151; 27 | alpha = 0.003; 28 | [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen, alpha, 5); 29 | % figure; 30 | % plot(costs); 31 | % title('Curve of Convergence'); 32 | % xlabel('Epoch'); ylabel('Cost'); 33 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 34 | fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen, alpha); 35 | fprintf('Bit error num: %d\n', BitErrorNum); 36 | fprintf('SER: %e\n', SymErrorRate); 37 | fprintf('BER: %e\n', BitErrorRate); 38 | 39 | % ChanLen1st = 121; 40 | % ChanLen2nd = 21; 41 | % ChanLen3rd = 0; 42 | % alpha = 0.003; 43 | % [EqualizedSignal, w, costs] = volterraFFEqualize(ExtractedSignal, OriginalData, 'lms', 10, ChanLen1st, alpha, ChanLen2nd, [], ChanLen3rd); 44 | % figure; 45 | % plot(costs); 46 | % title('Curve of Convergence'); 47 | % xlabel('Epoch'); ylabel('Cost'); 48 | 49 | % EqualizedSignalUS = resample(EqualizedSignal, OverSamplingRatio, 1); 50 | % ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 51 | % step(ed1, EqualizedSignalUS); 52 | % 53 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 54 | % fprintf('Equalization Setup: Volterra LMS Channel Length Setup is [%d %d %d], alpha is %f\n', ChanLen1st, ChanLen2nd, ChanLen3rd, alpha); 55 | % fprintf('Bit error num: %d\n', BitErrorNum); 56 | % fprintf('SER: %e\n', SymErrorRate); 57 | % fprintf('BER: %e\n', BitErrorRate); 58 | toc 59 | -------------------------------------------------------------------------------- /Script_SequenceExtraction.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 25e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | ProjectDir = '.\Sampled Data\201805lt\'; 13 | FileDir = [ProjectDir, '20180519\25G PAM16\soa\btb\prbs15\']; 14 | ROP = -7; 15 | i = 0; 16 | % for ROP = -7 : -2 : -15 17 | for i = 0 : 9 18 | FileName = [num2str(ROP), 'dBm', num2str(i), '.txt']; 19 | FilePath = [FileDir, 'raw\', FileName]; 20 | fprintf(['Processing ', replace(FilePath, '\', '\\'), ' ...\n']); 21 | SampledSignal = importdata(FilePath); 22 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 23 | % plotInFreq(SampledSignal, OSCRate); 24 | SampledSignal = LPF(SampledSignal); 25 | % plotInFreq(SampledSignal, OSCRate); 26 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 27 | 28 | % OriginalData = importdata([ProjectDir, 'pam16_', num2str(i), '.csv']); 29 | OriginalData = importdata([ProjectDir, 'prbs15_pam16.csv']); 30 | OriginalData = (OriginalData - mean(OriginalData)) / std(OriginalData); 31 | 32 | tic 33 | OriginalDataUS = upsample(OriginalData, OverSamplingRatio); 34 | CorrelationResult = conv(SampledSignal, OriginalDataUS(end:-1:1), 'valid'); 35 | figure; 36 | plot(CorrelationResult); 37 | title(FileName); 38 | toc 39 | [a, index] = max(CorrelationResult); 40 | 41 | ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 42 | csvwrite([FileDir, 'filtered\', num2str(ROP), 'dBm', num2str(i), '.csv'], ExtractedSignal); 43 | end 44 | % end 45 | 46 | %% Aux Functions 47 | function y = plotInFreq(in, Fs) 48 | % plotInFreq: plot signal in frequency domain 49 | L = length(in); 50 | Y = fft(in); 51 | M2 = abs(Y / L); 52 | M1 = M2(1 : L/2 + 1); 53 | M1(2 : end - 1) = 2 * M1(2 : end - 1); 54 | P2 = angle(Y / L); 55 | P1 = P2(1 : L/2 + 1) / pi; 56 | f = Fs * (0 : (L / 2)) / L; 57 | figure; 58 | % subplot(2, 1, 1); 59 | plot(f, 20 * log10(M1)) 60 | % subplot(2, 1, 2); 61 | % plot(f, P1) 62 | end 63 | 64 | function y = LPF(x) 65 | % All frequency values are in GHz. 66 | Fs = 80; % Sampling Frequency 67 | Fpass = 18; % Passband Frequency 68 | Fstop = 22; % Stopband Frequency 69 | Dpass = 0.057501127785; % Passband Ripple 70 | Dstop = 0.0001; % Stopband Attenuation 71 | dens = 20; % Density Factor 72 | % Calculate the order from the parameters using FIRPMORD. 73 | [N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]); 74 | % Calculate the coefficients using the FIRPM function. 75 | b = firpm(N, Fo, Ao, W, {dens}); 76 | Hd = dsp.FIRFilter('Numerator', b); 77 | y = step(Hd,double(x)); 78 | end 79 | -------------------------------------------------------------------------------- /decisionAndCalcBerPAM4.m: -------------------------------------------------------------------------------- 1 | function [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(InputSignal, OriginalData, threshold) 2 | % This function performs the PAM4 decision and bit error ratio calculation for PAM4. 3 | % First the PAM4 decision will be performed and then the error counting and error ratio 4 | % calculation. The %threshold% for PAM4 decision is a optional parameter, which have the 5 | % default value [0.25; 0.5; 0.75], allowing outside to perform some optimization on 6 | % the decision threshold of PAM4. 7 | % 8 | % input: 9 | % InputSignal 10 | % The input signal to be decided and error-calculated. 11 | % OriginalData 12 | % The origin data to be compared to the decided input signal to get the errors. 13 | % threshold (optional) 14 | % The PAM4 decision threshold, which can be adjusted outside this function. 15 | % Default: [0.25; 0.5; 0.75] 16 | % output: 17 | % BitErrorRate 18 | % The bit error ratio of the %InputSignal% comparing to %OriginalData%. 19 | % SymErrorRate 20 | % The symbol error ratio of the %InputSignal% comparing to %OriginalData%. 21 | % BitErrorNum 22 | % The number of bit error, which is 1/sym when only 1 bit changes and 2/sym 23 | % when both bits change. 24 | 25 | %% Parameters Checking 26 | narginchk(2, 3); 27 | 28 | %% Input Signal Normalization 29 | % InputSignal = InputSignal - min(InputSignal); 30 | % InputSignal = InputSignal / max(InputSignal); 31 | InputSignal = (InputSignal - mean(InputSignal)) / std(InputSignal); 32 | OriginalData = OriginalData - min(OriginalData); 33 | OriginalData = (OriginalData / max(OriginalData)) * 3; 34 | 35 | if ~exist('threshold','var') || isempty(threshold) 36 | threshold = zeros(3, 1); 37 | threshold(2) = mean(InputSignal); 38 | threshold(1) = mean(InputSignal(find(InputSignal <= threshold(2)))); 39 | threshold(3) = mean(InputSignal(find(InputSignal > threshold(2)))); 40 | % threshold = [0.25; 0.5; 0.75]; 41 | end 42 | 43 | %% Input Signal Decision 44 | InputSignal(find(InputSignal > threshold(3))) = 3; 45 | InputSignal(find(InputSignal > threshold(2) & InputSignal <= threshold(3))) = 2; 46 | InputSignal(find(InputSignal > threshold(1) & InputSignal <= threshold(2))) = 1; 47 | InputSignal(find(InputSignal <= threshold(1))) = 0; 48 | 49 | %% Error Counting 50 | SymErrorNum = length(find(InputSignal ~= OriginalData)); 51 | % The bit error number is 1/sym when only 1 bit changes and 2/sym when both bits change. 52 | BitErrorNum = SymErrorNum + length(find((InputSignal == 3) & (OriginalData == 1))) ... 53 | + length(find((InputSignal == 2) & (OriginalData == 0))) ... 54 | + length(find((InputSignal == 1) & (OriginalData == 3))) ... 55 | + length(find((InputSignal == 0) & (OriginalData == 2))); 56 | SymErrorRate = SymErrorNum / length(OriginalData); 57 | BitErrorRate = BitErrorNum / (2 * length(OriginalData)); 58 | 59 | OutputSignal = InputSignal; 60 | -------------------------------------------------------------------------------- /Script_playground.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | DataLength = 500000; 9 | SampleRate = 100e9; 10 | SymbolRate = 25e9; 11 | OverSamplingRatio = SampleRate / SymbolRate; 12 | rng('shuffle'); 13 | % Tx signal generation 14 | TxData = zeros(101, 1); 15 | TxData(51) = 1; 16 | TxSignal = reshape(repmat(TxData, 1, OverSamplingRatio)', [], 1); 17 | TxSignal = lowPass10G(TxSignal); 18 | TxSymNum = 1:0.25:101.75; 19 | figure;plot(TxSymNum, TxSignal) 20 | plotInFreq(TxSignal, SampleRate) 21 | 22 | %% Aux Functions 23 | function y = plotInFreq(in, Fs) 24 | % plotInFreq: plot signal in frequency domain 25 | L = length(in); 26 | Y = fft(in); 27 | M2 = abs(Y / L); 28 | M1 = M2(1 : L/2 + 1); 29 | M1(2 : end - 1) = 2 * M1(2 : end - 1); 30 | P2 = angle(Y / L); 31 | P1 = P2(1 : L/2 + 1) / pi; 32 | f = Fs * (0 : (L / 2)) / L; 33 | 34 | figure; 35 | % subplot(2, 1, 1); 36 | plot(f, 20 * log10(M1)) 37 | % subplot(2, 1, 2); 38 | % plot(f, P1) 39 | end 40 | 41 | function y = lowPass10G(x) 42 | % % % 20-order 10G Kaiser LPF 43 | % % % All frequency values are in GHz. 44 | % % Fs = 100; % Sampling Frequency 45 | % % N = 20; % Order 46 | % % Fc = 10; % Cutoff Frequency 47 | % % flag = 'scale'; % Sampling Flag 48 | % % Beta = 1; % Window Parameter 49 | % Hd = dsp.FIRFilter( ... 50 | % 'Numerator', [-6.64318883454626e-18 -0.01856525816569 ... 51 | % -0.0352121682532305 -0.041700902608702 -0.0309951315585328 ... 52 | % 7.94840490930163e-18 0.0486756433241017 0.106687218997798 ... 53 | % 0.161838954883738 0.201391397662279 0.215760491436478 0.201391397662279 ... 54 | % 0.161838954883738 0.106687218997798 0.0486756433241017 ... 55 | % 7.94840490930163e-18 -0.0309951315585328 -0.041700902608702 ... 56 | % -0.0352121682532305 -0.01856525816569 -6.64318883454626e-18]); 57 | 58 | % The following code was used to design the filter coefficients: 59 | % 60 | % N = 20; % Order 61 | % F3dB = 10; % 3-dB Frequency 62 | % Fs = 100; % Sampling Frequency 63 | Hd = dsp.BiquadFilter( ... 64 | 'Structure', 'Direct form II', ... 65 | 'SOSMatrix', [1 2 1 1 -1.54670446522043 0.911831860114908; 1 2 1 1 ... 66 | -1.42280301693279 0.758681247520709; 1 2 1 1 -1.32091343081943 ... 67 | 0.632738792885277; 1 2 1 1 -1.23786474339819 0.530084969790494; 1 2 1 1 ... 68 | -1.1710153071115 0.447454522282603; 1 2 1 1 -1.11823348180364 ... 69 | 0.382212598225574; 1 2 1 1 -1.07784909638848 0.33229475262289; 1 2 1 1 ... 70 | -1.04859957636261 0.29614035756167; 1 2 1 1 -1.0295819074045 ... 71 | 0.272633225955856; 1 2 1 1 -1.02021514617867 0.261055272351718], ... 72 | 'ScaleValues', [0.09128184872362; 0.0839695576469805; ... 73 | 0.0779563405164626; 0.0730550565980766; 0.0691098037927765; ... 74 | 0.0659947791054833; 0.0636114140586013; 0.0618851952997645; ... 75 | 0.060762829637839; 0.0602100315432626; 1]); 76 | y = step(Hd, double(x)); 77 | end 78 | -------------------------------------------------------------------------------- /Script_50G_VolterraSOA.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 25e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | FileName = '.\Sampled Data\50G PAM4\201708\826data\soa-6-10\-14.txt'; 13 | 14 | SampledSignal = importdata(FileName); 15 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 16 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 17 | 18 | ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(SampledSignal), max(SampledSignal)]); 19 | step(ed, SampledSignal); 20 | 21 | % Sequence Extraction 22 | tic 23 | OriginalData = importdata('.\Sampled Data\50G PAM4\201708\826data\data sequence.mat'); 24 | OriginalData = OriginalData'; 25 | OriginalData(find(OriginalData == 1)) = 3; 26 | OriginalData(find(OriginalData == 0.68)) = 1; 27 | OriginalData(find(OriginalData == 0.4)) = -1; 28 | OriginalData(find(OriginalData == 0)) = -3; 29 | CorrelationResult = zeros(length(SampledSignal) - OverSamplingRatio * length(OriginalData) + 1, 1); 30 | parfor i = 1 : length(CorrelationResult) 31 | CorrelationResult(i) = sum(SampledSignal(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 32 | end 33 | figure; 34 | plot(CorrelationResult); 35 | toc 36 | 37 | % BER counting 38 | [a, index] = max(CorrelationResult); 39 | ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 40 | [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 41 | fprintf('The signal error before equalization\n'); 42 | fprintf('Bit error num: %d\n', BitErrorNum); 43 | fprintf('SER: %e\n', SymErrorRate); 44 | fprintf('BER: %e\n', BitErrorRate); 45 | 46 | % EQ and BER counting 47 | tic 48 | % ChannelLen = 101:10:501; 49 | % alpha = [0.001; 0.0003; 0.0001]; 50 | % BER = zeros(length(ChannelLen), length(alpha)); 51 | % BitError = zeros(length(ChannelLen), length(alpha)); 52 | % for i = 1 : length(ChannelLen) 53 | % for j = 1 : length(alpha) 54 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen(i), alpha(j), 5); 55 | % % figure; 56 | % % plot(costs); 57 | % % title('Curve of Convergence'); 58 | % % xlabel('Epoch'); ylabel('Cost'); 59 | % 60 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 61 | % fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen(i), alpha(j)); 62 | % fprintf('Bit error num: %d\n', BitErrorNum); 63 | % fprintf('SER: %e\n', SymErrorRate); 64 | % fprintf('BER: %e\n', BitErrorRate); 65 | % BitError(i, j) = BitErrorNum; 66 | % BER(i, j) = BitErrorRate; 67 | % end 68 | % end 69 | % meshz(log10(alpha), ChannelLen, -log10(BER)); 70 | % title('BER vs ChannelLen & alpha') 71 | % xlabel('log10(alpha)') % x-axis label 72 | % ylabel('ChannelLen') % y-axis label 73 | % zlabel('-log10(BER)') % y-axis label 74 | 75 | ChanLen1st = 121; 76 | ChanLen2nd = 21; 77 | ChanLen3rd = 0; 78 | alpha = 0.003; 79 | [EqualizedSignal, w, costs] = volterraFFEqualize(ExtractedSignal, OriginalData, 'lms', 10, ChanLen1st, alpha, ChanLen2nd, [], ChanLen3rd); 80 | figure; 81 | plot(costs); 82 | title('Curve of Convergence'); 83 | xlabel('Epoch'); ylabel('Cost'); 84 | 85 | EqualizedSignalUS = resample(EqualizedSignal, OverSamplingRatio, 1); 86 | ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 87 | step(ed1, EqualizedSignalUS); 88 | 89 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 90 | fprintf('Equalization Setup: Volterra LMS Channel Length Setup is [%d %d %d], alpha is %f\n', ChanLen1st, ChanLen2nd, ChanLen3rd, alpha); 91 | fprintf('Bit error num: %d\n', BitErrorNum); 92 | fprintf('SER: %e\n', SymErrorRate); 93 | fprintf('BER: %e\n', BitErrorRate); 94 | toc 95 | -------------------------------------------------------------------------------- /mlseEqualize.m: -------------------------------------------------------------------------------- 1 | function [output, ChnlCoeffs, costs] = mlseEqualize(InputSignal, TrainingSignal, ... 2 | TraceBackLen, SamplesPerSymbol, ... 3 | ModFormat, epoch, alpha) 4 | % This function performs equalization based on maximum likelhood sequence estimation. 5 | % First, the InputSignal and TrainingSignal will be normalized to 0-1. 6 | % Then, the inverse linear FFE, which is a channel estimation, is performed 7 | % using a TraceBackLen taps FFE with a learning rate of alpha and training epoch times. 8 | % After training, the MLSE equalization using MATLAB Comm. Toolbox will be performed 9 | % and then the result will be returned. The parameter of MLSE equalizer such as TraceBackLen 10 | % and SamplesPerSymbol can be specified. The ModFormat determine the signal constellation map. 11 | % 12 | % input: 13 | % InputSignal 14 | % The input signal to be equalized. 15 | % TrainingSignal 16 | % The actual signal to be equalized to. 17 | % TraceBackLen (optional) 18 | % The trace back length of mlse equalizer 19 | % Default: 4 20 | % SamplesPerSymbol (optional) 21 | % The numbers of samples per symbol. 22 | % Default: 1 23 | % ModFormat (optional) 24 | % The modulation format: 'PAM4' or 'NRZ'. More modulation format will be added. 25 | % Default: 'PAM4' 26 | % epoch (optional) 27 | % The number of epochs to running in the channel estimation step. 28 | % Default: 5 29 | % alpha (optional) 30 | % The learning rate of LMS algorithm for channel estimation. 31 | % Default: 0.01 32 | % output: 33 | % output 34 | % The equalized signal with the same length of InputSignal 35 | % Size: length(InputSignal), 1 36 | % ChnlCoeffs 37 | % Channel coefficients 38 | % Size: TraceBackLen, 1 39 | % costs 40 | % The costs of channel estimation after each training epoch, which is 41 | % used to draw a curve of convergence and thus determine the best learning rate. 42 | 43 | %% Parameter Checking 44 | narginchk(2, 7); 45 | 46 | if ~exist('TraceBackLen','var') || isempty(TraceBackLen) 47 | TraceBackLen = 4; 48 | end 49 | if ~exist('SamplesPerSymbol','var') || isempty(SamplesPerSymbol) 50 | SamplesPerSymbol = 1; 51 | end 52 | if ~exist('ModFormat','var') || isempty(ModFormat) 53 | ModFormat = 'PAM4'; 54 | end 55 | if ~exist('epoch','var') || isempty(epoch) 56 | epoch = 5; 57 | end 58 | if ~exist('alpha','var') || isempty(alpha) 59 | alpha = 0.01; 60 | end 61 | 62 | %% Signal Normalization and Duplication 63 | % InputSignal and TrainingSignal is normalized to the range between 0-1. 64 | InputSignal = InputSignal - min(InputSignal); 65 | InputSignal = InputSignal / max(InputSignal); 66 | TrainingSignal = TrainingSignal - min(TrainingSignal); 67 | TrainingSignal = TrainingSignal / max(TrainingSignal); 68 | 69 | %% Channel Estimation 70 | % Zero Padding for training signal 71 | TrainingSignalZP = [zeros(TraceBackLen - 1, 1); TrainingSignal]; 72 | 73 | % Weights Initializing 74 | w = zeros(TraceBackLen, 1); 75 | w(TraceBackLen) = 1; 76 | 77 | % Training using LMS learning algorithm 78 | costs = zeros(epoch, 1); 79 | for n = 1 : epoch 80 | for i = 1 : length(TrainingSignalZP) - TraceBackLen + 1 81 | y(i) = w' * TrainingSignalZP(i : i + TraceBackLen - 1); 82 | w = w - alpha * (y(i) - InputSignal(i)) * TrainingSignalZP(i : i + TraceBackLen - 1); 83 | costs(n) = costs(n) + 0.5 * ((y(i) - InputSignal(i)) ^ 2); 84 | end 85 | % Record the cost/error of each epoch 86 | costs(n) = costs(n) / (length(TrainingSignalZP) - TraceBackLen + 1); 87 | end 88 | 89 | % Reverse w to get channel coefficients 90 | ChnlCoeffs = w(end:-1:1); 91 | 92 | %% MLSE equalization using MATLAB Commmunication Toolbox 93 | % Generating constellation map for different modulation format 94 | if ModFormat == 'PAM4' 95 | % const = [1/8; 3/8; 5/8; 7/8]; 96 | const = [0; 1/3; 2/3; 1]; 97 | elseif ModFormat == 'NRZ' 98 | const = [1/4; 3/4]; 99 | end 100 | % Performing the mlse equalization 101 | output = mlseeq(InputSignal, ChnlCoeffs, const, TraceBackLen, 'rst', SamplesPerSymbol); 102 | -------------------------------------------------------------------------------- /lowPassFilter25G.m: -------------------------------------------------------------------------------- 1 | function y = lowPassFilter25G(x) 2 | %LOWPASSFILTER25G Filters input x and returns output y. 3 | 4 | % MATLAB Code 5 | % Generated by MATLAB(R) 9.1 and the DSP System Toolbox 9.3. 6 | % Generated on: 13-Jul-2017 22:48:59 7 | 8 | %#codegen 9 | 10 | % To generate C/C++ code from this function use the codegen command. Type 11 | % 'help codegen' for more information. 12 | 13 | persistent Hd; 14 | 15 | if isempty(Hd) 16 | 17 | % The following code was used to design the filter coefficients: 18 | % % Equiripple Lowpass filter designed using the FIRPM function. 19 | % 20 | % % All frequency values are in GHz. 21 | % Fs = 600; % Sampling Frequency 22 | % 23 | % Fpass = 20; % Passband Frequency 24 | % Fstop = 30; % Stopband Frequency 25 | % Dpass = 0.057501127785; % Passband Ripple 26 | % Dstop = 0.001; % Stopband Attenuation 27 | % dens = 20; % Density Factor 28 | % 29 | % % Calculate the order from the parameters using FIRPMORD. 30 | % [N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]); 31 | % 32 | % % Calculate the coefficients using the FIRPM function. 33 | % b = firpm(N, Fo, Ao, W, {dens}); 34 | 35 | Hd = dsp.FIRFilter( ... 36 | 'Numerator', [0.00056252330752353 -0.0002210699675065 ... 37 | -0.000357791147890221 -0.00058852303901478 -0.000906321768734106 ... 38 | -0.00130462862798463 -0.00177406750290929 -0.00230060803688159 ... 39 | -0.00286434668282593 -0.00343965535922648 -0.00399546695780133 ... 40 | -0.00449644573328443 -0.00490475410904657 -0.00518219294711546 ... 41 | -0.00529266498698172 -0.00520490246185537 -0.00489514846401471 ... 42 | -0.00434978482818447 -0.00356791707284706 -0.00256297582194769 ... 43 | -0.00136381207804231 -1.46145494606937e-05 0.00142580929481935 ... 44 | 0.00288769921453774 0.00428741821222042 0.00553991682726253 ... 45 | 0.00655703682292805 0.00725515572628666 0.0075608221616118 ... 46 | 0.00741622893177966 0.00678416096763582 0.00565304169065939 ... 47 | 0.00403988116652243 0.00199257404417469 -0.000409593802526702 ... 48 | -0.00305725891938249 -0.00581414174684957 -0.00852193563599587 ... 49 | -0.0110069638070947 -0.0130880280699824 -0.0145852087202439 ... 50 | -0.0153295315840698 -0.0151724476883366 -0.0139950296441678 ... 51 | -0.0117160505259669 -0.00829871393213389 -0.00375440281280911 ... 52 | 0.00185289189501805 0.00840878885862349 0.0157500658890755 ... 53 | 0.0236700485360048 0.0319263723034723 0.0402508829153542 ... 54 | 0.0483601438686822 0.0559687845249519 0.0628015937513899 ... 55 | 0.0686062254188838 0.0731648913908242 0.0763045783699315 ... 56 | 0.0779051527315739 0.0779051527315739 0.0763045783699315 ... 57 | 0.0731648913908242 0.0686062254188838 0.0628015937513899 ... 58 | 0.0559687845249519 0.0483601438686822 0.0402508829153542 ... 59 | 0.0319263723034723 0.0236700485360048 0.0157500658890755 ... 60 | 0.00840878885862349 0.00185289189501805 -0.00375440281280911 ... 61 | -0.00829871393213389 -0.0117160505259669 -0.0139950296441678 ... 62 | -0.0151724476883366 -0.0153295315840698 -0.0145852087202439 ... 63 | -0.0130880280699824 -0.0110069638070947 -0.00852193563599587 ... 64 | -0.00581414174684957 -0.00305725891938249 -0.000409593802526702 ... 65 | 0.00199257404417469 0.00403988116652243 0.00565304169065939 ... 66 | 0.00678416096763582 0.00741622893177966 0.0075608221616118 ... 67 | 0.00725515572628666 0.00655703682292805 0.00553991682726253 ... 68 | 0.00428741821222042 0.00288769921453774 0.00142580929481935 ... 69 | -1.46145494606937e-05 -0.00136381207804231 -0.00256297582194769 ... 70 | -0.00356791707284706 -0.00434978482818447 -0.00489514846401471 ... 71 | -0.00520490246185537 -0.00529266498698172 -0.00518219294711546 ... 72 | -0.00490475410904657 -0.00449644573328443 -0.00399546695780133 ... 73 | -0.00343965535922648 -0.00286434668282593 -0.00230060803688159 ... 74 | -0.00177406750290929 -0.00130462862798463 -0.000906321768734106 ... 75 | -0.00058852303901478 -0.000357791147890221 -0.0002210699675065 ... 76 | 0.00056252330752353]); 77 | end 78 | 79 | y = step(Hd,double(x)); 80 | 81 | 82 | % [EOF] 83 | -------------------------------------------------------------------------------- /Script_50G_NoSOA.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 28e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | FileDir = '.\Sampled Data\50G PAM4\201709\56gpam4_10dbm\obtb\'; 13 | % ROP = -22 : -12; 14 | % ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(SampledSignal), max(SampledSignal)]); 15 | % step(ed, SampledSignal); 16 | % BER = zeros(length(ROP), 5); 17 | % BitError = zeros(length(ROP), 5); 18 | % i = 1; 19 | % for i = 1 : length(ROP) 20 | FileName = ['C2-12dBm00000.dat']; 21 | % FileName = [num2str(ROP(i)), 'dBm0.csv']; 22 | % FileName = '-10.txt'; 23 | SampledSignal = importdata([FileDir, FileName]); 24 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 25 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 26 | % % Sequence Extraction 27 | tic 28 | OriginalSignal = importdata('.\Original Data\Original_Data.txt'); 29 | OriginalSignal = (OriginalSignal - 0.5) * 2; 30 | OriginalData_port1 = OriginalSignal; 31 | shiftnum = 19732; 32 | OriginalData_port2 = [-(OriginalSignal(end - shiftnum + 1 : end)); 33 | -(OriginalSignal(1 : end - shiftnum))]; 34 | OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 35 | % OriginalData = OriginalData_port1; 36 | OriginalDataUS = upsample(OriginalData, OverSamplingRatio); 37 | CorrelationResult = conv(SampledSignal, OriginalDataUS(end:-1:1), 'valid'); 38 | figure; 39 | plot(CorrelationResult); 40 | title(FileName); 41 | toc 42 | [a, index] = max(CorrelationResult); 43 | ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 44 | 45 | % BER counting 46 | [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 47 | fprintf('The signal error before equalization\n'); 48 | fprintf('Bit error num: %d\n', BitErrorNum); 49 | fprintf('SER: %e\n', SymErrorRate); 50 | fprintf('BER: %e\n', BitErrorRate); 51 | % BER(i, 5) = BitErrorRate; 52 | % BitError(i, 5) = BitErrorNum; 53 | 54 | % EQ and BER counting 55 | tic 56 | ChannelLen = 87; 57 | alpha = 0.0067; 58 | % for j = 1 : length(ChannelLen) 59 | [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen, alpha, 10); 60 | % figure; 61 | % plot(costs); 62 | % title('Curve of Convergence'); 63 | % xlabel('Epoch'); ylabel('Cost'); 64 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 65 | fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen, alpha); 66 | fprintf('Bit error num: %d\n', BitErrorNum); 67 | fprintf('SER: %e\n', SymErrorRate); 68 | fprintf('BER: %e\n', BitErrorRate); 69 | % BER(i, j) = BitErrorRate; 70 | % BitError(i, j) = BitErrorNum; 71 | % end 72 | toc 73 | 74 | % tic 75 | % ChanLen1st = 121; 76 | % ChanLen2nd = 21; 77 | % ChanLen3rd = 5; 78 | % alpha = 0.003; 79 | % [EqualizedSignal, w, costs] = volterraFFEqualize(ExtractedSignal, OriginalData, 'lms', 10, ChanLen1st, alpha, ChanLen2nd, [], ChanLen3rd); 80 | % figure; 81 | % plot(costs); 82 | % title('Curve of Convergence'); 83 | % xlabel('Epoch'); ylabel('Cost'); 84 | % 85 | % EqualizedSignalUS = resample(EqualizedSignal, OverSamplingRatio, 1); 86 | % ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 87 | % step(ed1, EqualizedSignalUS); 88 | % 89 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 90 | % fprintf('Equalization Setup: Volterra LMS Channel Length Setup is [%d %d %d], alpha is %f\n', ChanLen1st, ChanLen2nd, ChanLen3rd, alpha); 91 | % fprintf('Bit error num: %d\n', BitErrorNum); 92 | % fprintf('SER: %e\n', SymErrorRate); 93 | % fprintf('BER: %e\n', BitErrorRate); 94 | % toc 95 | % end 96 | -------------------------------------------------------------------------------- /generateData.m: -------------------------------------------------------------------------------- 1 | function OriginalData = generateData(PAM4Flag, NewPRBSGenerationFlag) 2 | % This function generate NRZ or PAM4 data from PRBS generator or local file 3 | % and then generate the data with synchronization header which is then 4 | % loaded to PPG. 5 | % 6 | % input:(input parameter are all optional, the order of args follows the order below) 7 | % PAM4Flag 8 | % The flag for PAM4 generation: 9 | % 1: enable PAM4 generation 10 | % 0: disable PAM4 generation and output NRZ signal 11 | % Default value: 1 12 | % NewPRBSGenerationFlag 13 | % The flag for regenerating prbs data: 14 | % 1: regenerating new data 15 | % 0: load prbs data from ./Original Data/Original_Data_4096.txt 16 | % Note that if the ./Original Data/Original_Data_4096 doesn't exist, 17 | % the program will automatically generate new data whether this flag 18 | % is set to 1 or 0. 19 | % Default value: 0 20 | % output: 21 | % OriginalData 22 | % The original PAM4 or NRZ data without synchronization header in row vector. 23 | % Size: OriginalDataLength, 1 24 | 25 | narginchk(0,2); 26 | 27 | if ~exist('PAM4Flag','var') || isempty(PAM4Flag) 28 | PAM4Flag = 1; 29 | end 30 | 31 | if ~exist('NewPRBSGenerationFlag','var') || isempty(NewPRBSGenerationFlag) 32 | NewPRBSGenerationFlag = 0; 33 | end 34 | 35 | % change the current directory to the folder which contains this m file 36 | cd(fileparts(which(mfilename))); 37 | 38 | %% define parameter 39 | PathToOriginalData = '.\Original Data\'; % relative path 40 | OriginalDataFileName = 'Original_Data'; 41 | 42 | if exist('.\Original Data', 'dir') == 0 43 | mkdir('Original Data'); 44 | end 45 | 46 | %% PRBS generation 47 | if (NewPRBSGenerationFlag == 1) || (exist(strcat(PathToOriginalData, OriginalDataFileName, '.txt'), 'file') == 0) 48 | % h = commsrc.pattern('SamplingFrequency', 10000, ... 49 | % 'SamplesPerSymbol', 1, ... 50 | % 'PulseType', 'NRZ', ... 51 | % 'OutputLevels', [0 1], ... 52 | % 'RiseTime', 0, ... 53 | % 'FallTime', 0, ... 54 | % 'DataPattern', 'PRBS12'); % set the prbs pattern 55 | % OriginalData = generate(h, OriginalDataLength); 56 | % OriginalData = double(xor(1, OriginalData)); 57 | % Generating PRBS15 58 | fbconnection = [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1]; 59 | n = length(fbconnection); 60 | N = 2 ^ n - 1; 61 | OriginalData = zeros(N, 1); 62 | register = [zeros(1, n - 1), 1]; 63 | OriginalData(1) = register(n); 64 | for i = 2 : N 65 | newregister(1) = mod(sum(fbconnection .* register), 2); 66 | for j = 2 : n 67 | newregister(j) = register(j - 1); 68 | end 69 | register = newregister; 70 | OriginalData(i) = register(n); 71 | end 72 | 73 | % save the prbs data to .\Original Data\Original_Data.txt 74 | fid = fopen(strcat(PathToOriginalData, OriginalDataFileName, '.txt'), 'w'); 75 | fprintf(fid, '%d\r\n', OriginalData); 76 | fclose(fid); 77 | end 78 | OriginalData = importdata(strcat(PathToOriginalData, OriginalDataFileName, '.txt')); 79 | 80 | %% PAM4 generation 81 | % use 2 same prbs data, delay one with 2 sym, multiply the other one with 2 82 | % and then add the 2 data to form PAM4 data 83 | if PAM4Flag == 1 84 | OriginalData_port1 = OriginalData; 85 | % Day 2 Setup 86 | % shiftnum = 6; 87 | % OriginalData_port2 = [~(OriginalData(end - shiftnum + 1 : end)); 88 | % ~(OriginalData(1 : end - shiftnum))]; 89 | % OriginalData = OriginalData_port1 + 2 * OriginalData_port2; 90 | 91 | % 20170428 Setup 92 | % shiftnum = 6; 93 | % OriginalData_port2 = [~(OriginalData(shiftnum + 1 : end)); 94 | % ~(OriginalData(1 : shiftnum))]; 95 | % OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 96 | 97 | % 20170606 RoF Setup 98 | % shiftnum = 67; 99 | % OriginalData_port2 = [~(OriginalData(shiftnum + 1 : end)); 100 | % ~(OriginalData(1 : shiftnum))]; 101 | % OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 102 | 103 | % 20170608 RoF Setup 104 | shiftnum = 61; 105 | OriginalData_port2 = [~(OriginalData(end - shiftnum + 1 : end)); 106 | ~(OriginalData(1 : end - shiftnum))]; 107 | OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 108 | 109 | % save the PAM4 data to .\Original Data\Original_Data_4096_PAM4.txt 110 | fid = fopen(strcat(PathToOriginalData, OriginalDataFileName, '_PAM4.txt'), 'w'); 111 | fprintf(fid, '%d\r\n', OriginalData); 112 | fclose(fid); 113 | end 114 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | ## 这是什么 4 | 5 | 计划是实现一个用于通信的rx dsp库,其中包含数据产生、信号同步提取、均衡算法和判决与误码计算等代码。 6 | 7 | ## 尚未完成 8 | 9 | * 该readme的编写 10 | * 新的均衡算法的实现 11 | * Linear DFE 12 | * Volterra DFE 13 | * 一些Machine Learning算法 14 | * NRZ判决与误码计算 15 | * 用Python实现 16 | 17 | ## 核心函数 18 | 19 | ###信号处理辅助函数 20 | 21 | ```OriginalData = generateData(OriginalDataLength, PAM4Flag, NewPRBSGenerationFlag, SyncZerosLength)``` 22 | 23 | 产生数据函数。该函数可产生源数据,供其他函数以使用。此外,该函数还可以产生用于载入PPG发送的数据。目前可选产生NRZ或者PAM4数据。 24 | 25 | * 输入参数 26 | 27 | 1. OriginalDataLength(可选) 28 | 29 | 所产生的原始数据长度,默认为4096; 30 | 31 | 2. PAM4Flag(可选) 32 | 33 | 是否产生PAM4的标志:0为产生NRZ,1为产生PAM4。默认为1。 34 | 35 | 3. NewPRBSGenerationFlag(可选) 36 | 37 | 是否重新生成数据的标志:0为重新生成,1为读取./Original Data/Original_Data_4096.txt中的数据。默认为0。 38 | 39 | 4. SyncZerosLength(可选) 40 | 41 | 所产生给PPG的数据中同步部分0的个数,默认为50。 42 | 43 | * 输出参数 44 | 45 | OriginalData 46 | 47 | 所产生或从文件中读取的NRZ或者PAM4源数据。 48 | 49 | ```[ExtractedSignalUS, OriginalSignalUS] = syncAndExtractSignal(SampledData, OriginalData, OverSamplingRatio, UpSamplingRatio)``` 50 | 51 | 同步与信号提取函数。该函数可将所接收到的信号从DSO采集到的数据SampledData中同步并提取出来。 52 | 53 | * 输入参数 54 | 55 | 1. SampledData 56 | 57 | 从DSO来的采样数据 58 | 59 | 2. OriginalData 60 | 61 | 原始发送数据 62 | 63 | 3. OverSamplingRatio 64 | 65 | 过采样率,通常等于DSO采样率/信号速率 66 | 67 | 4. UpSamplingRatio(可选) 68 | 69 | 输出信号上采样率。默认值为1,即为不进行上采样。 70 | 71 | * 输出参数 72 | 73 | 1. ExtractedSignalUS 74 | 75 | 从SampledData中同步提取出来的信号,经过UpSamplingRatio倍上采样,是一个length(OriginalData)*UpSamplingRatio, 1的列向量。 76 | 77 | 2. OriginalSignalUS 78 | 79 | 经过UpSamplingRatio倍上采样的原始数据,也是一个length(OriginalData)*UpSamplingRatio, 1的列向量。 80 | 81 | ```[BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(InputSignal, OriginalData, threshold)``` 82 | 83 | PAM4判决与误码计算函数。 84 | 85 | * 输入参数 86 | 87 | 1. InputSignal 88 | 89 | 待判决的输入信号 90 | 91 | 2. OriginalData 92 | 93 | 用于计算误码的原始数据 94 | 95 | 3. threshold(可选) 96 | 97 | PAM4判决电平,默认为[0.25; 0.5; 0.75]。 98 | 99 | * 输出参数 100 | 101 | 1. BitErrorRate 102 | 103 | 误比特率。在计算误码率时,会计算错误一个符号时反转的比特数。 104 | 105 | 2. SymErrorRate 106 | 107 | 误符号率 108 | 109 | 3. BitErrorNum 110 | 111 | 误比特数 112 | 113 | ###均衡函数 114 | 115 | ```[output, w, costs] = linearFFEqualize(InputSignal, TrainingSignal, AlgType, FFETaps, alpha, epoch)``` 116 | 117 | linear FFE均衡函数。支持LMS和RLS两种算法。输入信号和训练信号会先被归一化到0-1。在目前的实现中所有的InputSignal都会被用于训练epoch次,在训练后会使用训练好的权重进行均衡。 118 | 119 | * 输入参数 120 | 121 | 1. InputSignal 122 | 123 | 将被均衡的输入信号。 124 | 125 | 2. TrainingSignal 126 | 127 | 用于训练的目标序列。 128 | 129 | 3. AlgType(可选) 130 | 131 | ‘lms’代表LMS算法,‘rls’代表RLS算法。默认为使用LMS算法。 132 | 133 | 4. FFETaps(可选) 134 | 135 | FFE抽头数量,需为奇数,默认为5。 136 | 137 | 5. alpha(可选) 138 | 139 | 学习速率。默认为0.01。 140 | 141 | 6. epoch(可选) 142 | 143 | 训练次数。默认为1。 144 | 145 | * 输出参数 146 | 147 | 1. output 148 | 149 | 均衡后的信号。一个length(InputSignal), 1的列向量。 150 | 151 | 2. w 152 | 153 | 训练好的权重。一个FFETaps, 1的列向量。 154 | 155 | 3. costs 156 | 157 | 每个训练epoch的cost向量,用于画收敛曲线以表现学习效果。 158 | 159 | 160 | ```[output, w, costs] = volLMSFFEqualize(InputSignal, TrainingSignal, chanLen, alpha1st, epoch, en2ndOrder, en3rdOrder, alpha2nd, alpha3rd)``` 161 | 162 | volterra FFE均衡函数。目前仅支持LMS算法,之后会增加对RLS算法的支持。输入信号和训练信号会先被归一化到0-1。在目前的实现中所有的InputSignal都会被用于训练epoch次,在训练后会使用训练好的权重进行均衡。 163 | 164 | * 输入参数 165 | 166 | 1. InputSignal 167 | 168 | 将被均衡的输入信号。 169 | 170 | 2. TrainingSignal 171 | 172 | 用于训练的目标序列。 173 | 174 | 3. chanLen(可选) 175 | 176 | 信道长度。必须为奇数。默认为5。 177 | 178 | 4. alpha1st(可选) 179 | 180 | volterra 1阶核的学习速率。默认为0.01。 181 | 182 | 5. epoch(可选) 183 | 184 | 训练次数。默认为1。 185 | 186 | 6. en2ndOrder(可选) 187 | 188 | 使用volterra 2阶核。默认为true。 189 | 190 | 7. en3rdOrder(可选) 191 | 192 | 使用volterra 3阶核。默认为true。 193 | 194 | 8. alpha2nd(可选) 195 | 196 | volterra 2阶核的学习速率。默认与alpha1st相等。 197 | 198 | 9. alpha3rd(可选) 199 | 200 | volterra 3阶核的学习速率。默认与alpha1st相等。 201 | 202 | * 输出参数 203 | 204 | 1. output 205 | 206 | 均衡后的信号。一个length(InputSignal), 1的列向量。 207 | 208 | 2. w 209 | 210 | 训练好的权重。一个chanLen + kernel2ndSize + kernel3rdSize, 1的列向量。 211 | 212 | 3. costs 213 | 214 | 每个训练epoch的cost向量,用于画收敛曲线以表现学习效果。 215 | 216 | 217 | ## 一些例子 218 | 219 | ```LMSFFEqualizationExample.m``` 220 | 221 | 这个例子展示了如何使用本库进行信号、同步、线性LMS均衡和判决的基本workflow。 222 | 223 | ```LMSFFEqualizationExample_2.m``` 224 | 225 | 这个例子展示了如何对整个文件夹中所采集到的dat文件进行遍历以画出BER曲线。同样使用线性LMS均衡器。 -------------------------------------------------------------------------------- /linearFFEqualize.m: -------------------------------------------------------------------------------- 1 | function [output, w, costs] = linearFFEqualize(InputSignal, TrainingSignal, AlgType, ... 2 | FFETaps, alpha, epoch) 3 | % This function performs the feed forward equalization with LMS or RLS algorithm. 4 | % First, the InputSignal and TrainingSignal will be normalized to 0-1. 5 | % The training will use all the InputSignal and will be performed epoch times. 6 | % The alpha is the learning rate of LMS or the forgetting factor of RLS, 7 | % which should be chosen carefully with the help of curve of convergence. 8 | % After training, the equalization will be performed and then the result will 9 | % be returned. 10 | % 11 | % input: 12 | % InputSignal 13 | % The input signal to be equalized. 14 | % TrainingSignal 15 | % The actual signal to be equalized to. 16 | % AlgType 17 | % 'lms' for LMS or 'rls' for RLS. 18 | % FFETaps (optional) 19 | % The numbers of FFE taps which must be odd. 20 | % Default: 5 21 | % alpha (optional) 22 | % The learning rate of LMS algorithm or the forgetting factor of RLS. 23 | % Default: 0.01 for AlgType = 'lms', 0.99 for AlgType = 'rls' 24 | % epoch (optional) 25 | % The epoch of the learning of LMS through all the input signal. 26 | % Default: 1 27 | % output: 28 | % output 29 | % The equalized signal with the same length of InputSignal 30 | % Size: length(InputSignal), 1 31 | % w 32 | % Weights of FFE 33 | % Size: FFETaps, 1 34 | % costs 35 | % The costs after each training epoch, which is used to draw a 36 | % curve of convergence and thus determine the best learning rate. 37 | 38 | %% Parameter Checking 39 | narginchk(3, 6); 40 | 41 | if ~exist('FFETaps','var') || isempty(FFETaps) 42 | FFETaps = 5; 43 | end 44 | 45 | if ~exist('alpha','var') || isempty(alpha) 46 | if AlgType == 'lms' 47 | alpha = 0.01; 48 | elseif AlgType == 'rls' 49 | alpha = 0.99; 50 | end 51 | end 52 | 53 | if ~exist('epoch','var') || isempty(epoch) 54 | epoch = 1; 55 | end 56 | 57 | % TODO add some parameter checking 58 | if mod(FFETaps, 2) == 0 59 | error('linearFeedForwardEqualize:argChk', 'FFE taps must be odd'); 60 | end 61 | 62 | if ~strcmp(AlgType, 'lms') && ~strcmp(AlgType, 'rls') 63 | error('linearFeedForwardEqualize:argChk', 'AlgType must be lms or rls'); 64 | end 65 | 66 | if FFETaps <= 0 67 | error('linearFeedForwardEqualize:argChk', 'FFE taps must be bigger than 0'); 68 | end 69 | 70 | %% Signal Normalization and Duplication 71 | % InputSignal and TrainingSignal is normalized to the range between 0-1. 72 | InputSignal = InputSignal - min(InputSignal); 73 | InputSignal = InputSignal / max(InputSignal); 74 | TrainingSignal = TrainingSignal - min(TrainingSignal); 75 | TrainingSignal = TrainingSignal / max(TrainingSignal); 76 | 77 | % Both signal is duplicated for better performance 78 | InputSignalDup = repmat(InputSignal, 2, 1); 79 | TrainingSignalDup = repmat(TrainingSignal, 2, 1); 80 | % Zero Padding for input signal 81 | InputSignalZP = [InputSignalDup(end-floor(FFETaps/2)+1 : end); InputSignalDup; InputSignalDup(1:floor(FFETaps/2))]; 82 | 83 | %% Weights Initializing 84 | % TODO choose on : randomly init weights or init to 0 85 | w = zeros(FFETaps, 1); 86 | w(floor(length(w)/2) + 1) = 1; 87 | % rng('shuffle'); 88 | % w = rand(FFETaps, 1); 89 | % w = 2 * w - 1; 90 | 91 | %% Training 92 | costs = zeros(epoch, 1); 93 | y = zeros(size(TrainingSignalDup)); 94 | if AlgType == 'lms' 95 | % The LMS learning algorithm 96 | for n = 1 : epoch 97 | for i = 1 : length(InputSignalZP) - FFETaps + 1 98 | y(i) = w' * InputSignalZP(i : i + FFETaps - 1); 99 | w = w - alpha * (y(i) - TrainingSignalDup(i)) * InputSignalZP(i : i + FFETaps - 1); 100 | costs(n) = costs(n) + 0.5 * ((y(i) - TrainingSignalDup(i)) ^ 2); 101 | end 102 | % Record the cost/error of each epoch 103 | costs(n) = costs(n) / (length(InputSignalZP) - FFETaps + 1); 104 | end 105 | elseif AlgType == 'rls' 106 | % The RLS learning algorithm 107 | Sd = eye(FFETaps); 108 | for n = 1 : epoch 109 | for i = 1 : length(InputSignalZP) - FFETaps + 1 110 | x = InputSignalZP(i : i + FFETaps - 1); 111 | e = TrainingSignalDup(i) - w' * x; 112 | phi = Sd * x; 113 | Sd = (1 / alpha) * (Sd - (phi * phi') / (alpha + phi' * x)); 114 | w = w + e * Sd * x; 115 | costs(n) = costs(n) + 0.5 * (e ^ 2); 116 | end 117 | % Record the cost/error of each epoch 118 | costs(n) = costs(n) / (length(InputSignalZP) - FFETaps + 1); 119 | end 120 | end 121 | 122 | %% Using Trained Weights to Equalize Data 123 | for i = 1 : length(InputSignalZP) - FFETaps + 1 124 | y(i) = w' * InputSignalZP(i : i + FFETaps - 1); 125 | end 126 | 127 | % TODO choose a half of the output 128 | output = y(1 : length(y) / 2); 129 | % output = y(length(y) / 2 + 1 : end); 130 | -------------------------------------------------------------------------------- /Script_50G_SequenceExtraction.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | OSCRate = 80e9; 9 | DataRate = 33e9; 10 | SampleRate = lcm(OSCRate, DataRate); 11 | OverSamplingRatio = SampleRate / DataRate; 12 | ProjectDir = '.\Sampled Data\201805lt\'; 13 | FileDir = [ProjectDir, 'O-band\33G PAM8\btb\prbs15\']; 14 | % FileDir = '.\Sampled Data\50G PAM4\201709\56gpam4_10dbm\25km\'; 15 | % ROP = -22:-13; 16 | ROP = -11; 17 | i = 0; 18 | % for ROP = -19 : 2 : -11 19 | % for i = 0 : 4 20 | % FileName = ['C2', num2str(ROP), 'dBm0000', num2str(i), '.dat']; 21 | FileName = [num2str(ROP), '_', num2str(i), '.txt']; 22 | FilePath = [FileDir, 'raw\', FileName]; 23 | fprintf(['Processing ', replace(FilePath, '\', '\\'), ' ...\n']); 24 | SampledSignal = importdata(FilePath); 25 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 26 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 27 | mean(SampledSignal) 28 | std(SampledSignal) 29 | 30 | OriginalData = importdata([ProjectDir, 'pam16_', num2str(i), '.csv']); 31 | % OriginalData = importdata([ProjectDir, 'prbs15_pam16.csv']); 32 | % OriginalData = importdata('.\Sampled Data\50G PAM4\201709\56gpam4_10dbm\25km\extracted\prbs15pam4.csv'); 33 | % OriginalData = OriginalData'; 34 | % OriginalData = 3 - OriginalData; 35 | % csvwrite([FileDir, 'extracted\pam4_', num2str(i), '.csv'], OriginalData); 36 | OriginalData = (OriginalData - mean(OriginalData)) / std(OriginalData); 37 | % OriginalSignal = (OriginalSignal - 0.5) * 2; 38 | % OriginalData_port1 = OriginalSignal; 39 | % shiftnum = 13035; 40 | % OriginalData_port2 = [-(OriginalSignal(shiftnum + 1 : end)); 41 | % -(OriginalSignal(1 : shiftnum))]; 42 | % OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 43 | % tic 44 | % CorrelationResult = zeros(length(SampledSignal) - OverSamplingRatio * length(OriginalData) + 1, 1); 45 | % parfor i = 1 : length(CorrelationResult) 46 | % CorrelationResult(i) = sum(SampledSignal(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 47 | % end 48 | % figure; 49 | % plot(CorrelationResult); 50 | % title(FileName); 51 | % toc 52 | 53 | plotInFreq(SampledSignal, SampleRate); 54 | % SampledSignal = lowPass10G(SampledSignal); 55 | % SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 56 | % plotInFreq(SampledSignal, SampleRate); 57 | 58 | % % TODO remove this 59 | % ed0 = comm.EyeDiagram('DisplayMode', '2D color histogram', 'OversamplingMethod', 'Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(SampledSignal), max(SampledSignal)]); 60 | % step(ed0, SampledSignal); 61 | % % TODO Matched Filtering 62 | % SampledSignal = filter(ones(OverSamplingRatio, 1), 1, SampledSignal); 63 | % SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 64 | % plotInFreq(SampledSignal, SampleRate); 65 | 66 | % tic 67 | % OriginalDataUS = upsample(OriginalData, OverSamplingRatio); 68 | % CorrelationResult = conv(SampledSignal, OriginalDataUS(end:-1:1), 'valid'); 69 | % figure; 70 | % plot(CorrelationResult); 71 | % title(FileName); 72 | % toc 73 | % [a, index] = max(CorrelationResult); 74 | 75 | % ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 76 | % csvwrite([FileDir, 'extracted\', num2str(ROP), 'dBm', num2str(i), '.csv'], ExtractedSignal); 77 | 78 | % ExtractedSignal = SampledSignal(index : index + length(OriginalData) * OverSamplingRatio - 1); 79 | % ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Histogram interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(ExtractedSignal), max(ExtractedSignal)]); 80 | % step(ed, ExtractedSignal); 81 | % end 82 | % end 83 | 84 | %% Aux Functions 85 | function y = plotInFreq(in, Fs) 86 | % plotInFreq: plot signal in frequency domain 87 | L = length(in); 88 | Y = fft(in); 89 | M2 = abs(Y / L); 90 | M1 = M2(1 : L/2 + 1); 91 | M1(2 : end - 1) = 2 * M1(2 : end - 1); 92 | P2 = angle(Y / L); 93 | P1 = P2(1 : L/2 + 1) / pi; 94 | f = Fs * (0 : (L / 2)) / L; 95 | 96 | figure; 97 | % subplot(2, 1, 1); 98 | plot(f, 20 * log10(M1)) 99 | % subplot(2, 1, 2); 100 | % plot(f, P1) 101 | end 102 | 103 | function y = lowPass10G(x) 104 | % All frequency values are in GHz. 105 | Fs = 560; % Sampling Frequency 106 | Fpass = 10; % Passband Frequency 107 | Fstop = 15; % Stopband Frequency 108 | Dpass = 0.057501127785; % Passband Ripple 109 | Dstop = 0.01; % Stopband Attenuation 110 | flag = 'scale'; % Sampling Flag 111 | % Calculate the order from the parameters using KAISERORD. 112 | [N, Wn, BETA, TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]); 113 | % Calculate the coefficients using the FIR1 function. 114 | b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag); 115 | Hd = dsp.FIRFilter('Numerator', b); 116 | y = step(Hd,double(x)); 117 | end 118 | -------------------------------------------------------------------------------- /Script_RoF_Wireless_SquareLawDetection.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | RawSignal = importdata('.\Sampled Data\RoF\wireless\40km\20170801_2_4Vpp\C3rof 6-5dBm00000.dat'); 9 | 10 | SampleRate = 600e9; 11 | OSCRate = 120e9; 12 | DataRate = 12.5e9; 13 | OverSamplingRatio = SampleRate / DataRate; 14 | 15 | SampledSignal = (RawSignal(:, 1) - mean(RawSignal(:, 1))) / std(RawSignal(:, 1)); 16 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 17 | 18 | t = (0:length(SampledSignal)-1)*(1/SampleRate); 19 | t = t'; 20 | 21 | index = find( (t < 22e-9) & (t > 2e-9)); 22 | 23 | X = SampledSignal; 24 | L = length(X); 25 | Y = fft(X); 26 | P2 = abs(Y/L); 27 | P1 = P2(1:L/2+1); 28 | P1(2:end-1) = 2*P1(2:end-1); 29 | Fs = SampleRate; 30 | f = Fs*(0:(L/2))/L; 31 | figure; 32 | plot(f,20 * log10(P1)) 33 | 34 | r = bandPassFilter12G38G(SampledSignal); 35 | 36 | figure; 37 | plot(t(index), r(index)) 38 | 39 | X = r; 40 | L = length(X); 41 | Y = fft(X); 42 | P2 = abs(Y/L); 43 | P1 = P2(1:L/2+1); 44 | P1(2:end-1) = 2*P1(2:end-1); 45 | Fs = SampleRate; 46 | f = Fs*(0:(L/2))/L; 47 | figure; 48 | plot(f,20 * log10(P1)) 49 | 50 | r = r .^ 2; 51 | 52 | X = r; 53 | L = length(X); 54 | Y = fft(X); 55 | P2 = abs(Y/L); 56 | P1 = P2(1:L/2+1); 57 | P1(2:end-1) = 2*P1(2:end-1); 58 | Fs = SampleRate; 59 | f = Fs*(0:(L/2))/L; 60 | figure; 61 | plot(f,20 * log10(P1)) 62 | 63 | r = lowPassFilter12_5G(r); 64 | 65 | figure; 66 | plot(t(index), r(index)) 67 | 68 | X = r; 69 | L = length(X); 70 | Y = fft(X); 71 | P2 = abs(Y/L); 72 | P1 = P2(1:L/2+1); 73 | P1(2:end-1) = 2*P1(2:end-1); 74 | Fs = SampleRate; 75 | f = Fs*(0:(L/2))/L; 76 | figure; 77 | plot(f,20 * log10(P1)) 78 | 79 | r = (r - mean(r)) / std(r); 80 | 81 | ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', 48, 'YLimits', [min(r(100000: 200000)), max(r(100000: 200000))]); 82 | step(ed, r(100000: 200000)); 83 | 84 | tic 85 | % OverSamplingRatio = 1; 86 | OriginalSignal = importdata('.\Original Data\Original_Data.txt'); 87 | OriginalSignal = (OriginalSignal - 0.5 ) * 2; 88 | OriginalData_port1 = OriginalSignal; 89 | shiftnum = 58; 90 | OriginalData_port2 = [-(OriginalSignal(end - shiftnum + 1 : end)); 91 | -(OriginalSignal(1 : end - shiftnum))]; 92 | OriginalData = OriginalData_port1 + 2 * OriginalData_port2; 93 | % OriginalData = OriginalData_port1; 94 | CorrelationResult = zeros(length(r) - OverSamplingRatio * length(OriginalData) + 1, 1); 95 | parfor i = 1 : length(CorrelationResult) 96 | CorrelationResult(i) = sum(r(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 97 | end 98 | figure; 99 | plot(CorrelationResult) 100 | % TODO: Remove tic/toc 101 | toc 102 | 103 | [a, index] = max(CorrelationResult); 104 | ExtractedSignal = r(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 105 | [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 106 | fprintf('The signal error before equalization\n'); 107 | fprintf('Bit error num: %d\n', BitErrorNum); 108 | fprintf('SER: %e\n', SymErrorRate); 109 | fprintf('BER: %e\n', BitErrorRate); 110 | 111 | % linear FFE 112 | 113 | % ChannelLen = 101:10:501; 114 | % alpha = [0.01; 0.003; 0.001]; 115 | % BER = zeros(length(ChannelLen), length(alpha)); 116 | % BitError = zeros(length(ChannelLen), length(alpha)); 117 | % for i = 1 : length(ChannelLen) 118 | % for j = 1 : length(alpha) 119 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen(i), alpha(j), 5); 120 | % % figure; 121 | % % plot(costs); 122 | % % title('Curve of Convergence'); 123 | % % xlabel('Epoch'); ylabel('Cost'); 124 | % 125 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 126 | % fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen(i), alpha(j)); 127 | % fprintf('Bit error num: %d\n', BitErrorNum); 128 | % fprintf('SER: %e\n', SymErrorRate); 129 | % fprintf('BER: %e\n', BitErrorRate); 130 | % BitError(i, j) = BitErrorNum; 131 | % BER(i, j) = BitErrorRate; 132 | % end 133 | % end 134 | % meshz(log10(alpha), ChannelLen, -log10(BER)); 135 | % title('BER vs ChannelLen & alpha') 136 | % xlabel('log10(alpha)') % x-axis label 137 | % ylabel('ChannelLen') % y-axis label 138 | % zlabel('-log10(BER)') % y-axis label 139 | 140 | % tic 141 | % 142 | % ChanLen1st = 301; 143 | % ChanLen2nd = 33; 144 | % ChanLen3rd = 11; 145 | % alpha = 0.003; 146 | % 147 | % [EqualizedSignal, w, costs] = volterraFFEqualize(ExtractedSignal, OriginalData, 'lms', 10, ChanLen1st, alpha, ChanLen2nd, [], ChanLen3rd); 148 | % figure; 149 | % plot(costs); 150 | % title('Curve of Convergence'); 151 | % xlabel('Epoch'); ylabel('Cost'); 152 | % 153 | % EqualizedSignalUS = resample(EqualizedSignal, 48, 1); 154 | % ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', 48, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 155 | % step(ed1, EqualizedSignalUS); 156 | % 157 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 158 | % fprintf('Equalization Setup: Volterra LMS Channel Length Setup is [%d %d %d], alpha is %f\n', ChanLen1st, ChanLen2nd, ChanLen3rd, alpha); 159 | % fprintf('Bit error num: %d\n', BitErrorNum); 160 | % fprintf('SER: %e\n', SymErrorRate); 161 | % fprintf('BER: %e\n', BitErrorRate); 162 | % toc 163 | -------------------------------------------------------------------------------- /Script_RoF_Wireless_CoherentDetection.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | RawSignal = importdata('.\Sampled Data\RoF\wireless\40km\20170731_LO_Changed\C3rof 3dBm carrier00000.dat'); 9 | 10 | SampleRate = 600e9; 11 | OSCRate = 120e9; 12 | DataRate = 12.5e9; 13 | OverSamplingRatio = SampleRate / DataRate; 14 | 15 | SampledSignal = (RawSignal(:, 1) - mean(RawSignal(:, 1))) / std(RawSignal(:, 1)); 16 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 17 | 18 | t = (0:length(SampledSignal)-1)*(1/SampleRate); 19 | t = t'; 20 | 21 | index = find( (t < 22e-9) & (t > 2e-9)); 22 | 23 | fc = 25e9; 24 | lo = cos(2*pi*fc*t) + i * -sin(2*pi*fc*t); 25 | 26 | figure; 27 | % plot(t(index), SampledSignal(index), t(index), real(lo(index)), 'r') 28 | plot(t(index), SampledSignal(index)) 29 | X = SampledSignal; 30 | L = length(X); 31 | Y = fft(X); 32 | P2 = abs(Y/L); 33 | P1 = P2(1:L/2+1); 34 | P1(2:end-1) = 2*P1(2:end-1); 35 | Fs = SampleRate; 36 | f = Fs*(0:(L/2))/L; 37 | figure; 38 | plot(f,20 * log10(P1)) 39 | 40 | r = bandPassFilter12G38G(SampledSignal); 41 | 42 | figure; 43 | plot(t(index), r(index)) 44 | 45 | X = r; 46 | L = length(X); 47 | Y = fft(X); 48 | P2 = abs(Y/L); 49 | P1 = P2(1:L/2+1); 50 | P1(2:end-1) = 2*P1(2:end-1); 51 | Fs = SampleRate; 52 | f = Fs*(0:(L/2))/L; 53 | figure; 54 | plot(f,20 * log10(P1)) 55 | 56 | r = r .* lo; 57 | 58 | X = real(r); 59 | L = length(X); 60 | Y = fft(X); 61 | P2 = abs(Y/L); 62 | P1 = P2(1:L/2+1); 63 | P1(2:end-1) = 2*P1(2:end-1); 64 | Fs = SampleRate; 65 | f = Fs*(0:(L/2))/L; 66 | figure; 67 | plot(f,20 * log10(P1)) 68 | 69 | r = lowPassFilter12_5G(r); 70 | 71 | figure; 72 | subplot(2,1,1); 73 | plot(t(index), real(r(index))) 74 | subplot(2,1,2); 75 | plot(t(index), imag(r(index))) 76 | 77 | X = real(r); 78 | L = length(X); 79 | Y = fft(X); 80 | P2 = abs(Y/L); 81 | P1 = P2(1:L/2+1); 82 | P1(2:end-1) = 2*P1(2:end-1); 83 | Fs = SampleRate; 84 | f = Fs*(0:(L/2))/L; 85 | figure; 86 | plot(f,20 * log10(P1)) 87 | 88 | scatterplot(r) 89 | 90 | r = abs(r); 91 | r = (r - mean(r)) / std(r); 92 | 93 | r = r(501:end); 94 | X = r; 95 | L = length(X); 96 | Y = fft(X); 97 | P2 = abs(Y/L); 98 | P1 = P2(1:L/2+1); 99 | P1(2:end-1) = 2*P1(2:end-1); 100 | Fs = SampleRate; 101 | f = Fs*(0:(L/2))/L; 102 | figure; 103 | plot(f,20 * log10(P1)) 104 | 105 | ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', 48, 'YLimits', [min(r(100000: 200000)), max(r(100000: 200000))]); 106 | step(ed, r(100000: 200000)); 107 | 108 | tic 109 | % OverSamplingRatio = 1; 110 | OriginalSignal = importdata('.\Original Data\Original_Data.txt'); 111 | OriginalSignal = (OriginalSignal - 0.5 ) * 2; 112 | OriginalData_port1 = OriginalSignal; 113 | shiftnum = 58; 114 | OriginalData_port2 = [-(OriginalSignal(end - shiftnum + 1 : end)); 115 | -(OriginalSignal(1 : end - shiftnum))]; 116 | OriginalData = OriginalData_port1 + 2 * OriginalData_port2; 117 | % OriginalData = OriginalData_port1; 118 | CorrelationResult = zeros(length(r) - OverSamplingRatio * length(OriginalData) + 1, 1); 119 | parfor i = 1 : length(CorrelationResult) 120 | CorrelationResult(i) = sum(r(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 121 | end 122 | figure; 123 | plot(CorrelationResult) 124 | % TODO: Remove tic/toc 125 | toc 126 | % 127 | % [a, index] = max(CorrelationResult); 128 | % ExtractedSignal = r(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 129 | % [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 130 | % fprintf('The signal error before equalization\n'); 131 | % fprintf('Bit error num: %d\n', BitErrorNum); 132 | % fprintf('SER: %e\n', SymErrorRate); 133 | % fprintf('BER: %e\n', BitErrorRate); 134 | 135 | % linear FFE 136 | % 137 | % ChannelLen = 101:10:501; 138 | % alpha = [0.001; 0.0003; 0.0001]; 139 | % BER = zeros(length(ChannelLen), length(alpha)); 140 | % BitError = zeros(length(ChannelLen), length(alpha)); 141 | % for i = 1 : length(ChannelLen) 142 | % for j = 1 : length(alpha) 143 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen(i), alpha(j), 5); 144 | % % figure; 145 | % % plot(costs); 146 | % % title('Curve of Convergence'); 147 | % % xlabel('Epoch'); ylabel('Cost'); 148 | % 149 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 150 | % fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen(i), alpha(j)); 151 | % fprintf('Bit error num: %d\n', BitErrorNum); 152 | % fprintf('SER: %e\n', SymErrorRate); 153 | % fprintf('BER: %e\n', BitErrorRate); 154 | % BitError(i, j) = BitErrorNum; 155 | % BER(i, j) = BitErrorRate; 156 | % end 157 | % end 158 | % meshz(log10(alpha), ChannelLen, -log10(BER)); 159 | % title('BER vs ChannelLen & alpha') 160 | % xlabel('log10(alpha)') % x-axis label 161 | % ylabel('ChannelLen') % y-axis label 162 | % zlabel('-log10(BER)') % y-axis label 163 | 164 | tic 165 | 166 | ChanLen1st = 301; 167 | ChanLen2nd = 33; 168 | ChanLen3rd = 11; 169 | alpha = 0.003; 170 | 171 | [EqualizedSignal, w, costs] = volterraFFEqualize(ExtractedSignal, OriginalData, 'lms', 10, ChanLen1st, alpha, ChanLen2nd, [], ChanLen3rd); 172 | figure; 173 | plot(costs); 174 | title('Curve of Convergence'); 175 | xlabel('Epoch'); ylabel('Cost'); 176 | 177 | EqualizedSignalUS = resample(EqualizedSignal, 48, 1); 178 | ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', 48, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 179 | step(ed1, EqualizedSignalUS); 180 | 181 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 182 | fprintf('Equalization Setup: Volterra LMS Channel Length Setup is [%d %d %d], alpha is %f\n', ChanLen1st, ChanLen2nd, ChanLen3rd, alpha); 183 | fprintf('Bit error num: %d\n', BitErrorNum); 184 | fprintf('SER: %e\n', SymErrorRate); 185 | fprintf('BER: %e\n', BitErrorRate); 186 | toc 187 | -------------------------------------------------------------------------------- /Script_RoFWired.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | %% Import sampled data from DSO 9 | % Defining parameters 10 | SampleRate = 200e9; 11 | OSCRate = 40e9; 12 | DataRate = 12.5e9; 13 | OverSamplingRatio = SampleRate / DataRate; 14 | 15 | SampledSignal = importdata('.\Sampled Data\RoF\wired\20170802\C1-1800000.dat'); 16 | SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 17 | SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 18 | 19 | ed = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(SampledSignal), max(SampledSignal)]); 20 | step(ed, SampledSignal); 21 | 22 | tic 23 | % OverSamplingRatio = 1; 24 | OriginalSignal = importdata('.\Original Data\Original_Data.txt'); 25 | OriginalSignal = (OriginalSignal - 0.5 ) * 2; 26 | OriginalData_port1 = OriginalSignal; 27 | shiftnum = 58; 28 | % OriginalData_port2 = [-(OriginalSignal(end - shiftnum + 1 : end)); 29 | % -(OriginalSignal(1 : end - shiftnum))]; 30 | OriginalData_port2 = [-(OriginalSignal(shiftnum + 1 : end)); 31 | -(OriginalSignal(1 : shiftnum))]; 32 | OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 33 | % OriginalData = OriginalData_port1; 34 | CorrelationResult = zeros(length(SampledSignal) - OverSamplingRatio * length(OriginalData) + 1, 1); 35 | parfor i = 1 : length(CorrelationResult) 36 | CorrelationResult(i) = sum(SampledSignal(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 37 | end 38 | figure; 39 | plot(CorrelationResult) 40 | % TODO: Remove tic/toc 41 | toc 42 | 43 | [a, index] = max(CorrelationResult); 44 | ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 45 | [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 46 | fprintf('The signal error before equalization\n'); 47 | fprintf('Bit error num: %d\n', BitErrorNum); 48 | fprintf('SER: %e\n', SymErrorRate); 49 | fprintf('BER: %e\n', BitErrorRate); 50 | 51 | [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', 21, 1e-3, 10); 52 | figure; 53 | plot(costs); 54 | title('Curve of Convergence'); 55 | xlabel('Epoch'); ylabel('Cost'); 56 | 57 | EqualizedSignalUS = resample(EqualizedSignal, OverSamplingRatio, 1); 58 | ed1 = comm.EyeDiagram('DisplayMode','2D color histogram','OversamplingMethod','Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(EqualizedSignalUS), max(EqualizedSignalUS)]); 59 | step(ed1, EqualizedSignalUS); 60 | 61 | [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 62 | fprintf('Equalization Setup: Linear LMS Channel Length is 21, alpha is 1e-3\n'); 63 | fprintf('Bit error num: %d\n', BitErrorNum); 64 | fprintf('SER: %e\n', SymErrorRate); 65 | fprintf('BER: %e\n', BitErrorRate); 66 | 67 | % linear FFE 68 | % ChannelLen = 11:10:201; 69 | % alpha = [0.003; 0.001; 0.0003]; 70 | % BER = zeros(length(ChannelLen), length(alpha)); 71 | % BitError = zeros(length(ChannelLen), length(alpha)); 72 | % for i = 1 : length(ChannelLen) 73 | % for j = 1 : length(alpha) 74 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', ChannelLen(i), alpha(j), 10); 75 | % % figure; 76 | % % plot(costs); 77 | % % title('Curve of Convergence'); 78 | % % xlabel('Epoch'); ylabel('Cost'); 79 | % 80 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 81 | % fprintf('Equalization Setup: Linear LMS Channel Length is %d, alpha is %f\n', ChannelLen(i), alpha(j)); 82 | % fprintf('Bit error num: %d\n', BitErrorNum); 83 | % fprintf('SER: %e\n', SymErrorRate); 84 | % fprintf('BER: %e\n', BitErrorRate); 85 | % BitError(i, j) = BitErrorNum; 86 | % BER(i, j) = BitErrorRate; 87 | % end 88 | % end 89 | % meshz(log10(alpha), ChannelLen, -log10(BER)); 90 | % title('BER vs ChannelLen & alpha') 91 | % xlabel('log10(alpha)') % x-axis label 92 | % ylabel('ChannelLen') % y-axis label 93 | % zlabel('-log10(BER)') % y-axis label 94 | 95 | 96 | % PathToSampledDataFolder = '.\Sampled Data\RoF\wired\20170802\'; 97 | % FileList = dir(PathToSampledDataFolder); 98 | % BERwEQ = zeros(length(FileList) - 2, 1); 99 | % BERwoEQ = BERwEQ; 100 | % for i = 1 : length(FileList) - 2 101 | % PathToSampledData = strcat(PathToSampledDataFolder, FileList(i+2).name); 102 | % SampledSignal = importdata(PathToSampledData); 103 | % SampledSignal = (SampledSignal - mean(SampledSignal)) / std(SampledSignal); 104 | % SampledSignal = resample(SampledSignal, SampleRate, OSCRate); 105 | % tic 106 | % OriginalSignal = importdata('.\Original Data\Original_Data.txt'); 107 | % OriginalSignal = (OriginalSignal - 0.5 ) * 2; 108 | % OriginalData_port1 = OriginalSignal; 109 | % shiftnum = 58; 110 | % OriginalData_port2 = [-(OriginalSignal(shiftnum + 1 : end)); 111 | % -(OriginalSignal(1 : shiftnum))]; 112 | % OriginalData = 2 * OriginalData_port1 + OriginalData_port2; 113 | % % OriginalData = OriginalData_port1; 114 | % CorrelationResult = zeros(length(SampledSignal) - OverSamplingRatio * length(OriginalData) + 1, 1); 115 | % parfor i = 1 : length(CorrelationResult) 116 | % CorrelationResult(i) = sum(SampledSignal(i : OverSamplingRatio : i + OverSamplingRatio * length(OriginalData) - 1) .* OriginalData); 117 | % end 118 | % figure; 119 | % plot(CorrelationResult) 120 | % % TODO: Remove tic/toc 121 | % toc 122 | % 123 | % [a, index] = max(CorrelationResult); 124 | % ExtractedSignal = SampledSignal(index : OverSamplingRatio : index + length(OriginalData) * OverSamplingRatio - 1); 125 | % [BitErrorRate, SymErrorRate, BitErrorNum, OutputSignal] = decisionAndCalcBerPAM4(ExtractedSignal, OriginalData); 126 | % fprintf('The signal error before equalization\n'); 127 | % fprintf('Bit error num: %d\n', BitErrorNum); 128 | % fprintf('SER: %e\n', SymErrorRate); 129 | % fprintf('BER: %e\n', BitErrorRate); 130 | % BERwoEQ(i) = BitErrorRate; 131 | % 132 | % [EqualizedSignal, w, costs] = linearFFEqualize(ExtractedSignal, OriginalData, 'lms', 21, 1e-3, 10); 133 | % % figure; 134 | % % plot(costs); 135 | % % title('Curve of Convergence'); 136 | % % xlabel('Epoch'); ylabel('Cost'); 137 | % 138 | % [BitErrorRate, SymErrorRate, BitErrorNum] = decisionAndCalcBerPAM4(EqualizedSignal, OriginalData); 139 | % fprintf('Equalization Setup: Linear LMS Channel Length is 21, alpha is 1e-3\n'); 140 | % fprintf('Bit number num: %d \n', BitErrorNum); 141 | % fprintf('SER: %e\n', SymErrorRate); 142 | % fprintf('BER: %e\n', BitErrorRate); 143 | % BERwEQ(i) = BitErrorRate; 144 | % end 145 | % 146 | % x = [-12; -13; -14; -15; -17; -18; -19; -20; -21; -22]; 147 | % plot(x, log10(BERwEQ), x, log10(BERwoEQ), 'r') 148 | % title('BER curve w(b)/wo(r) FFE'); 149 | % xlabel('ROP/dBm'); ylabel('log10(BER)'); 150 | -------------------------------------------------------------------------------- /Script_PTLSim.m: -------------------------------------------------------------------------------- 1 | clear all; 2 | close all; 3 | clc; 4 | 5 | %% change the current directory to the folder which contains this m file 6 | cd(fileparts(which(mfilename))); 7 | 8 | DataLength = 500000; 9 | SampleRate = 100e9; 10 | SymbolRate = 25e9; 11 | OverSamplingRatio = SampleRate / SymbolRate; 12 | rng('shuffle'); 13 | % Tx signal generation 14 | PAM4Data = randi(4, DataLength, 1) - 1; 15 | TxData = [PAM4Data(end - 99: end); PAM4Data; PAM4Data(1: 100)]; 16 | % TxSignal = resample(TxData, SampleRate, SymbolRate); 17 | TxSignal = reshape(repmat(TxData, 1, OverSamplingRatio)', [], 1); 18 | TxSignal = (TxSignal - mean(TxSignal)) / std(TxSignal); 19 | plotInFreq(TxSignal, SampleRate) 20 | 21 | % Transmit through a band-limited AWGN channel 22 | RxSignal = TxSignal; 23 | % RxSignal = zeros(size(TxSignal)); 24 | % RxSignal = awgn(RxSignal, 22.5); 25 | % RxSignal = lowPass10G(RxSignal); 26 | RxSignal = awgn(RxSignal, 20); 27 | % RxSignal = lowPass30G(RxSignal); 28 | % RxSignal = (RxSignal - mean(RxSignal)) / std(RxSignal); 29 | % RxSignal = lowPass10G(RxSignal); 30 | plotInFreq(RxSignal, SampleRate) 31 | 32 | % % TODO remove this 33 | % ed0 = comm.EyeDiagram('DisplayMode', '2D color histogram', 'OversamplingMethod', 'Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(RxSignal), max(RxSignal)]); 34 | % step(ed0, RxSignal); 35 | 36 | % TODO Matched Filtering 37 | RxSignal = filter(ones(OverSamplingRatio, 1), 1, RxSignal); 38 | plotInFreq(RxSignal, SampleRate) 39 | 40 | % Extracted transmitted signal 41 | tic 42 | OriginalDataUS = upsample(PAM4Data, OverSamplingRatio); 43 | CorrelationResult = conv(RxSignal, OriginalDataUS(end:-1:1), 'valid'); 44 | figure; 45 | plot(CorrelationResult); 46 | toc 47 | [a, index] = max(CorrelationResult); 48 | 49 | % ExtractedSignal = RxSignal(index : index + DataLength * OverSamplingRatio - 1); 50 | % ed = comm.EyeDiagram('DisplayMode', '2D color histogram', 'OversamplingMethod', 'Input interpolation', 'SamplesPerSymbol', OverSamplingRatio, 'YLimits', [min(ExtractedSignal), max(ExtractedSignal)]); 51 | % step(ed, ExtractedSignal); 52 | 53 | % ExtractedSignal = RxSignal(index : OverSamplingRatio : index + DataLength * OverSamplingRatio - 1); 54 | % Dataset = zeros(DataLength - 100, 101); 55 | % Noise = awgn(zeros(size(ExtractedSignal)), 25); 56 | % NoiseDataset = zeros(DataLength - 100, 101);; 57 | % for i = 1 : length(Dataset) 58 | % Dataset(i, :) = ExtractedSignal(i : i + 100, :)'; 59 | % NoiseDataset(i, :) = Noise(i : i + 100, :)'; 60 | % end 61 | % figure; 62 | % subplot(2, 1, 1); plot(svd(Dataset)) 63 | % subplot(2, 1, 2); plot(svd(NoiseDataset)) 64 | 65 | % x = zeros(length(ExtractedSignal) - 101 + 1, 101); 66 | % for i = 1 : length(ExtractedSignal) - 101 + 1 67 | % x(i, :) = ExtractedSignal(i : i + 101 - 1)'; 68 | % end 69 | % Sigma = (1 / size(x, 1)) * x' * x; 70 | % [U, S, V] = svd(Sigma); 71 | % k = 70; 72 | % z = x * U(:, 1 : k); 73 | % x_approx = z * U(:, 1 : k)'; 74 | % figure;plot(sum(S)); 75 | % sum(sum((x - x_approx) .^ 2)) / sum(sum((x) .^ 2)) 76 | csvwrite(['.\Sampled Data\Simulation\', 'rx.csv'], ExtractedSignal); 77 | csvwrite(['.\Sampled Data\Simulation\', 'tx.csv'], PAM4Data); 78 | 79 | %% Aux Functions 80 | function y = plotInFreq(in, Fs) 81 | % plotInFreq: plot signal in frequency domain 82 | L = length(in); 83 | Y = fft(in); 84 | M2 = abs(Y / L); 85 | M1 = M2(1 : L/2 + 1); 86 | M1(2 : end - 1) = 2 * M1(2 : end - 1); 87 | P2 = angle(Y / L); 88 | P1 = P2(1 : L/2 + 1) / pi; 89 | f = Fs * (0 : (L / 2)) / L; 90 | 91 | figure; 92 | % subplot(2, 1, 1); 93 | plot(f, 20 * log10(M1)) 94 | % subplot(2, 1, 2); 95 | % plot(f, P1) 96 | end 97 | 98 | function y = lowPass10G(x) 99 | % % 20-order 10G Kaiser LPF 100 | % % All frequency values are in GHz. 101 | % Fs = 100; % Sampling Frequency 102 | % N = 20; % Order 103 | % Fc = 10; % Cutoff Frequency 104 | % flag = 'scale'; % Sampling Flag 105 | % Beta = 1; % Window Parameter 106 | Hd = dsp.FIRFilter( ... 107 | 'Numerator', [-6.64318883454626e-18 -0.01856525816569 ... 108 | -0.0352121682532305 -0.041700902608702 -0.0309951315585328 ... 109 | 7.94840490930163e-18 0.0486756433241017 0.106687218997798 ... 110 | 0.161838954883738 0.201391397662279 0.215760491436478 0.201391397662279 ... 111 | 0.161838954883738 0.106687218997798 0.0486756433241017 ... 112 | 7.94840490930163e-18 -0.0309951315585328 -0.041700902608702 ... 113 | -0.0352121682532305 -0.01856525816569 -6.64318883454626e-18]); 114 | y = step(Hd, double(x)); 115 | 116 | % % A butterworth LPF simulating DML/PD inband frequency fading 117 | % Fpass = 1; % Passband Frequency 118 | % Fstop = 20; % Stopband Frequency 119 | % Apass = 1; % Passband Ripple (dB) 120 | % Astop = 10; % Stopband Attenuation (dB) 121 | % Fs = 100; % Sampling Frequency 122 | % h = fdesign.lowpass('fp,fst,ap,ast', Fpass, Fstop, Apass, Astop, Fs); 123 | % Hd = design(h, 'butter', ... 124 | % 'MatchExactly', 'stopband', ... 125 | % 'SystemObject', true); 126 | % x = step(Hd, double(x)); 127 | % % 4th-order Bessel LPF 128 | % % All frequency values are in GHz. 129 | % Nb = 4; % Numerator Order 130 | % Na = 4; % Denominator Order 131 | % F3dB = 12; % 3-dB Frequency 132 | % Fs = 100; % Sampling Frequency 133 | % h = fdesign.lowpass('nb,na,f3db', Nb, Na, F3dB, Fs); 134 | % Hd = design(h, 'butter', 'SystemObject', true); 135 | % y = step(Hd, double(x)); 136 | end 137 | 138 | function y = lowPass25G(x) 139 | % % All frequency values are in GHz. 140 | % Fs = 100; % Sampling Frequency 141 | % N = 20; % Order 142 | % Fc = 25; % Cutoff Frequency 143 | % flag = 'scale'; % Sampling Flag 144 | % Beta = 1; % Window Parameter 145 | Hd = dsp.FIRFilter( ... 146 | 'Numerator', [1.50218896096586e-17 0.0285686861166202 ... 147 | -1.64045849115145e-17 -0.0396594867673816 1.75232583993696e-17 ... 148 | 0.0587052701799814 -1.83460182902814e-17 -0.101464478833822 ... 149 | 1.88493140942653e-17 0.309906147011409 0.487887724586386 ... 150 | 0.309906147011409 1.88493140942653e-17 -0.101464478833822 ... 151 | -1.83460182902814e-17 0.0587052701799814 1.75232583993696e-17 ... 152 | -0.0396594867673816 -1.64045849115145e-17 0.0285686861166202 ... 153 | 1.50218896096586e-17]); 154 | y = step(Hd,double(x)); 155 | end 156 | 157 | function y = lowPass5G(x) 158 | % % All frequency values are in GHz. 159 | % Fs = 100; % Sampling Frequency 160 | % N = 20; % Order 161 | % Fc = 5; % Cutoff Frequency 162 | % flag = 'scale'; % Sampling Flag 163 | % Beta = 1; % Window Parameter 164 | Hd = dsp.FIRFilter( ... 165 | 'Numerator', [2.71637240797039e-18 0.00798192017345794 ... 166 | 0.017797042461414 0.0290094491915146 0.0410132167097605 ... 167 | 0.0530776687430912 0.0644083314945248 0.0742175172547654 ... 168 | 0.0817971427167792 0.0865859254643814 0.0882235715806219 ... 169 | 0.0865859254643814 0.0817971427167792 0.0742175172547654 ... 170 | 0.0644083314945248 0.0530776687430912 0.0410132167097605 ... 171 | 0.0290094491915146 0.017797042461414 0.00798192017345794 ... 172 | 2.71637240797039e-18]); 173 | y = step(Hd,double(x)); 174 | end 175 | 176 | function y = lowPass30G(x) 177 | Fpass = 30; % Passband Frequency 178 | Fstop = 33; % Stopband Frequency 179 | Apass = 1; % Passband Ripple (dB) 180 | Astop = 80; % Stopband Attenuation (dB) 181 | Fs = 100; % Sampling Frequency 182 | h = fdesign.lowpass('fp,fst,ap,ast', Fpass, Fstop, Apass, Astop, Fs); 183 | Hd = design(h, 'butter', ... 184 | 'MatchExactly', 'stopband', ... 185 | 'SystemObject', true); 186 | y = step(Hd, double(x)); 187 | end 188 | -------------------------------------------------------------------------------- /volterraFFEqualize.m: -------------------------------------------------------------------------------- 1 | function [output, w, costs] = volterraFFEqualize(InputSignal, TrainingSignal, ... 2 | AlgType, epoch, ... 3 | ChanLen1st, Alpha1st, ... 4 | ChanLen2nd, Alpha2nd, ... 5 | ChanLen3rd, Alpha3rd, ... 6 | EnRAE, WeightNum) 7 | % This function performs the volterra feedforward equalization with LMS or RLS algorithm. 8 | % For now only 1st-3rd order are supported. 1st order must be included, while 2nd 9 | % and 3rd orders are optional and controlled by the ChanLen2nd and ChanLen3rd 10 | % flags. The LMS learning rate of different order can be different by adjusting the 11 | % Alpha1st, Alpha2nd and Alpha3rd. The equalizer will be trained on the 12 | % InputSignal epoch times and will then perform a equalization. 13 | % 14 | % input: 15 | % InputSignal 16 | % The input signal to be equalized. 17 | % TrainingSignal 18 | % The actual signal to be equalized to. 19 | % AlgType 20 | % 'lms' for LMS or 'rls' for RLS. 21 | % epoch (optional) 22 | % The epoch of the learning through all the input signal. 23 | % Default: 1 24 | % ChanLen1st (optional) 25 | % The channel length of 1st order kernel. 26 | % Default: 5 27 | % Alpha1st (optional) 28 | % The 1st order kernel learning rate of LMS algorithm or the forgetting factor of RLS. 29 | % Default: 0.01 for AlgType = 'lms', 0.99 for AlgType = 'rls' 30 | % ChanLen2nd (optional) 31 | % The channel length of 2nd order kernel. 32 | % Default: ChanLen1st 33 | % Alpha2nd (optional) 34 | % The 2nd order kernel learning rate of LMS algorithm or the forgetting factor of RLS. 35 | % In rls algorithm, this parameter is forced to be Alpha1st. 36 | % Default: Alpha1st 37 | % ChanLen3rd (optional) 38 | % The channel length of 3rd order kernel. 39 | % Default: ChanLen1st 40 | % Alpha3rd (optional) 41 | % The 3rd order kernel learning rate of LMS algorithm or the forgetting factor of RLS. 42 | % In rls algorithm, this parameter is forced to be Alpha1st. 43 | % Default: Alpha1st 44 | % EnRAE (optional) 45 | % The flag of enable RAE search algorithm. 46 | % Default: false 47 | % WeightNum (optional) 48 | % The weight number to be simplified to by RAE. 49 | % Default: 100 50 | % 51 | % output: 52 | % output 53 | % The equalized signal with the same length of InputSignal 54 | % Size: length(InputSignal), 1 55 | % w 56 | % Weights of volterra series 57 | % Size: length(Q, 2), 1 58 | % costs 59 | % The costs after each training epoch, which is used to draw a 60 | % curve of convergence and thus determine the best learning rate. 61 | 62 | %% Paramete_raer Checking 63 | narginchk(3, 12); 64 | 65 | if ~exist('epoch','var') || isempty(epoch) 66 | epoch = 1; 67 | end 68 | 69 | if ~exist('ChanLen1st','var') || isempty(ChanLen1st) 70 | ChanLen1st = 5; 71 | end 72 | if ~exist('Alpha1st','var') || isempty(Alpha1st) 73 | if strcmp(AlgType, 'lms') 74 | Alpha1st = 0.01; 75 | elseif strcmp(AlgType, 'rls') 76 | Alpha1st = 0.99; 77 | end 78 | end 79 | 80 | if ~exist('ChanLen2nd','var') || isempty(ChanLen2nd) 81 | ChanLen2nd = ChanLen1st; 82 | end 83 | 84 | if ~exist('Alpha2nd','var') || isempty(Alpha2nd) 85 | Alpha2nd = Alpha1st; 86 | end 87 | 88 | if ~exist('ChanLen3rd','var') || isempty(ChanLen3rd) 89 | ChanLen3rd = ChanLen1st; 90 | end 91 | 92 | if ~exist('Alpha3rd','var') || isempty(Alpha3rd) 93 | Alpha3rd = Alpha1st; 94 | end 95 | 96 | if ~exist('EnRAE','var') || isempty(EnRAE) 97 | EnRAE = false; 98 | end 99 | 100 | if ~exist('WeightNum','var') || isempty(WeightNum) 101 | WeightNum = 150; 102 | end 103 | 104 | % TODO add some parameter checking 105 | if ChanLen1st <= 0 106 | error('volterraFeedForwardEqualize:argChk', '1st order Channel length must be greater than 0'); 107 | end 108 | 109 | if mod(ChanLen1st, 2) == 0 110 | error('volterraFeedForwardEqualize:argChk', 'Channel length must be odd'); 111 | end 112 | 113 | if (ChanLen2nd ~= 0) && (ChanLen3rd ~= 0) 114 | if (mod(ChanLen2nd, 2) == 0) || (mod(ChanLen3rd, 2) == 0) 115 | error('volterraFeedForwardEqualize:argChk', 'Channel length must be odd'); 116 | end 117 | end 118 | 119 | if ~strcmp(AlgType, 'lms') && ~strcmp(AlgType, 'rls') 120 | error('volterraFeedForwardEqualize:argChk', 'AlgType must be lms or rls'); 121 | end 122 | 123 | if ChanLen1st <= 0 124 | error('volterraFeedForwardEqualize:argChk', '1st order channel length must be bigger than 0'); 125 | end 126 | 127 | %% Signal Normalization and Duplication 128 | % InputSignal and TrainingSignal is normalized to the range between 0-1. 129 | InputSignal = InputSignal - min(InputSignal); 130 | InputSignal = InputSignal / max(InputSignal); 131 | TrainingSignal = TrainingSignal - min(TrainingSignal); 132 | TrainingSignal = TrainingSignal / max(TrainingSignal); 133 | 134 | % Both signal is duplicated for better performance 135 | InputSignalDup = repmat(InputSignal, 2, 1); 136 | TrainingSignalDup = repmat(TrainingSignal, 2, 1); 137 | % Zero Padding for input signal 138 | MaxChanLen = max([ChanLen1st, ChanLen2nd, ChanLen3rd]); 139 | InputSignalZP = [InputSignalDup(end-floor(MaxChanLen/2)+1 : end); InputSignalDup; InputSignalDup(1:floor(MaxChanLen/2))]; 140 | 141 | %% Calculating the kernel size 142 | KernelSize = ChanLen1st; 143 | Kernel2ndSize = 0; 144 | Kernel3rdSize = 0; 145 | if ChanLen2nd ~= 0 146 | for k = 1 : ChanLen2nd 147 | for m = k : ChanLen2nd 148 | Kernel2ndSize = Kernel2ndSize + 1; 149 | end 150 | end 151 | KernelSize = KernelSize + Kernel2ndSize; 152 | end 153 | if ChanLen3rd ~= 0 154 | for k = 1 : ChanLen3rd 155 | for m = k : ChanLen3rd 156 | for n = m : ChanLen3rd 157 | Kernel3rdSize = Kernel3rdSize + 1; 158 | end 159 | end 160 | end 161 | KernelSize = KernelSize + Kernel3rdSize; 162 | end 163 | 164 | %% Weights Searching using RAE 165 | % Generating input matrix 166 | X = zeros(length(InputSignalDup), KernelSize); 167 | for i = 1 : ChanLen1st 168 | X(:, i) = InputSignalZP(floor(MaxChanLen/2) + i - floor(ChanLen1st/2) : ... 169 | floor(MaxChanLen/2) + i - floor(ChanLen1st/2) + length(InputSignalDup) - 1); 170 | end 171 | t = ChanLen1st; 172 | if ChanLen2nd ~= 0 173 | for k = 1 : ChanLen2nd 174 | for m = k : ChanLen2nd 175 | t = t + 1; 176 | X(:, t) = InputSignalZP(floor(MaxChanLen/2) + k - floor(ChanLen2nd/2) : ... 177 | floor(MaxChanLen/2) + k - floor(ChanLen2nd/2) + length(InputSignalDup) - 1) .*... 178 | InputSignalZP(floor(MaxChanLen/2) + m - floor(ChanLen2nd/2) : ... 179 | floor(MaxChanLen/2) + m - floor(ChanLen2nd/2) + length(InputSignalDup) - 1); 180 | end 181 | end 182 | end 183 | if ChanLen3rd ~= 0 184 | for k = 1 : ChanLen3rd 185 | for m = k : ChanLen3rd 186 | for n = m : ChanLen3rd 187 | t = t + 1; 188 | X(:, t) = InputSignalZP(floor(MaxChanLen/2) + k - floor(ChanLen3rd/2) : ... 189 | floor(MaxChanLen/2) + k - floor(ChanLen3rd/2) + length(InputSignalDup) - 1) .*... 190 | InputSignalZP(floor(MaxChanLen/2) + m - floor(ChanLen3rd/2) : ... 191 | floor(MaxChanLen/2) + m - floor(ChanLen3rd/2) + length(InputSignalDup) - 1) .*... 192 | InputSignalZP(floor(MaxChanLen/2) + n - floor(ChanLen3rd/2) : ... 193 | floor(MaxChanLen/2) + n - floor(ChanLen3rd/2) + length(InputSignalDup) - 1); 194 | end 195 | end 196 | end 197 | end 198 | 199 | % RAE process: Q is the output selected kernel matrix 200 | if EnRAE == true 201 | y = TrainingSignalDup; 202 | p = 1; 203 | ete_rae = zeros(KernelSize, KernelSize); 204 | 205 | for i = 1 : KernelSize 206 | w_rae = (X(:, i)' * y) / (X(:, i)' * X(:, i)); 207 | ete_rae(1, i) = y' * y - w_rae * X(:, i)' * y; 208 | end 209 | [ete_rae_min, i] = min(ete_rae(1, :)); 210 | w_rae = (X(:, i)' * y) / (X(:, i)' * X(:, i)); 211 | Q = [X(:, i)]; 212 | if i <= ChanLen1st 213 | KernelOrder = [1]; 214 | elseif i <= ChanLen1st + Kernel2ndSize 215 | KernelOrder = [2]; 216 | else 217 | KernelOrder = [3]; 218 | end 219 | % find the center position 220 | if i == floor(ChanLen1st / 2) + 1 221 | CenterPosition = size(Q, 2); 222 | end 223 | R = Q' / (Q' * Q); 224 | p = p + 1; 225 | 226 | while (p <= WeightNum) 227 | for i = 1 : KernelSize 228 | if ismember(X(:, i)', Q', 'rows') == 1 229 | ete_rae(p, i) = inf; 230 | continue 231 | end 232 | z_rae = R * X(:, i); 233 | delta_rae = 1 / (X(:, i)' * X(:, i) - X(:, i)' * Q * z_rae); 234 | g_rae = delta_rae * (z_rae' * Q' - X(:, i)'); 235 | w_rae_temp = [w_rae + z_rae * g_rae * y; -g_rae * y]; 236 | ete_rae(p, i) = y' * y - y' * [Q, X(:, i)] * w_rae_temp; 237 | end 238 | [ete_rae_min, i] = min(ete_rae(p, :)); 239 | z_rae = R * X(:, i); 240 | delta_rae = 1 / (X(:, i)' * X(:, i) - X(:, i)' * Q * z_rae); 241 | g_rae = delta_rae * (z_rae' * Q' - X(:, i)'); 242 | w_rae = [w_rae + z_rae * g_rae * y; -g_rae * y]; 243 | Q = [Q, X(:, i)]; 244 | if i <= ChanLen1st 245 | KernelOrder = [KernelOrder; 1]; 246 | elseif i <= ChanLen1st + Kernel2ndSize 247 | KernelOrder = [KernelOrder; 2]; 248 | else 249 | KernelOrder = [KernelOrder; 3]; 250 | end 251 | % find the center position 252 | if i == floor(ChanLen1st / 2) + 1 253 | CenterPosition = size(Q, 2); 254 | end 255 | R = [R + z_rae * g_rae; -g_rae]; 256 | p = p + 1; 257 | end 258 | else 259 | Q = X; 260 | KernelOrder = [zeros(ChanLen1st, 1) + 1; 261 | zeros(Kernel2ndSize, 1) + 2; 262 | zeros(Kernel3rdSize, 1) + 3;]; 263 | CenterPosition = floor(ChanLen1st / 2) + 1; 264 | end 265 | % Define and randomly init weights vector to (-1, 1) 266 | rng('shuffle'); 267 | w = zeros(size(Q, 2), 1); 268 | w(CenterPosition) = 1; 269 | 270 | %% Training epoch times 271 | costs = zeros(epoch, 1); 272 | y = zeros(size(TrainingSignalDup)); 273 | if strcmp(AlgType, 'lms') 274 | % The LMS learning algorithm 275 | for iter = 1 : epoch 276 | for i = 1 : size(Q, 1) 277 | y(i) = Q(i, :) * w; 278 | % Construct a diagnose matrix for different learning rate of different order 279 | alpha = [Alpha1st; Alpha2nd; Alpha3rd]; 280 | alpha = diag(alpha(KernelOrder)); 281 | % learning step 282 | w = w - alpha * (y(i) - TrainingSignalDup(i)) * Q(i, :)'; 283 | costs(iter) = costs(iter) + 0.5 * ((y(i) - TrainingSignalDup(i)) ^ 2); 284 | end 285 | % Record the cost/error of each epoch 286 | costs(iter) = costs(iter) / size(Q, 1); 287 | end 288 | elseif strcmp(AlgType, 'rls') 289 | % The RLS learning algorithm 290 | Sd = eye(size(Q, 2)); 291 | for iter = 1 : epoch 292 | for i = 1 : size(Q, 1) 293 | x = Q(i, :)'; 294 | e = TrainingSignalDup(i) - w' * x; 295 | phi = Sd * x; 296 | Sd = (1 / Alpha1st) * (Sd - (phi * phi') / (Alpha1st + phi' * x)); 297 | w = w + e * Sd * x; 298 | costs(iter) = costs(iter) + 0.5 * (e ^ 2); 299 | end 300 | % Record the cost/error of each epoch 301 | costs(iter) = costs(iter) / size(Q, 1); 302 | end 303 | end 304 | 305 | %% Using Trained Weights to Equalize Data 306 | for i = 1 : size(Q, 1) 307 | y(i) = Q(i, :) * w; 308 | end 309 | 310 | % TODO choose a half of the output 311 | output = y(1 : length(y) / 2); 312 | % output = y(length(y) / 2 + 1 : end); 313 | -------------------------------------------------------------------------------- /bandPassFilter15G35G.m: -------------------------------------------------------------------------------- 1 | function y = bandPassFilter15G35G(x) 2 | %BANDPASSFILTER15G35G Filters input x and returns output y. 3 | 4 | % MATLAB Code 5 | % Generated by MATLAB(R) 9.1 and the DSP System Toolbox 9.3. 6 | % Generated on: 29-Jul-2017 10:05:38 7 | 8 | %#codegen 9 | 10 | % To generate C/C++ code from this function use the codegen command. Type 11 | % 'help codegen' for more information. 12 | 13 | persistent Hd; 14 | 15 | if isempty(Hd) 16 | 17 | % The following code was used to design the filter coefficients: 18 | % % Equiripple Bandpass filter designed using the FIRPM function. 19 | % 20 | % % All frequency values are in GHz. 21 | % Fs = 600; % Sampling Frequency 22 | % 23 | % Fstop1 = 15; % First Stopband Frequency 24 | % Fpass1 = 16; % First Passband Frequency 25 | % Fpass2 = 34; % Second Passband Frequency 26 | % Fstop2 = 35; % Second Stopband Frequency 27 | % Dstop1 = 0.01; % First Stopband Attenuation 28 | % Dpass = 0.057501127785; % Passband Ripple 29 | % Dstop2 = 0.01; % Second Stopband Attenuation 30 | % dens = 20; % Density Factor 31 | % 32 | % % Calculate the order from the parameters using FIRPMORD. 33 | % [N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ... 34 | % 0], [Dstop1 Dpass Dstop2]); 35 | % 36 | % % Calculate the coefficients using the FIRPM function. 37 | % b = firpm(N, Fo, Ao, W, {dens}); 38 | 39 | Hd = dsp.FIRFilter( ... 40 | 'Numerator', [-0.00328662612537043 0.00304400411355789 ... 41 | 0.00100889182085265 -0.000438850868031051 -0.00132696181743952 ... 42 | -0.00175190210005007 -0.00183121533693241 -0.00166979884539573 ... 43 | -0.00135063007552091 -0.000930213854910791 -0.000447793739480768 ... 44 | 7.01502854637626e-05 0.000599082943233155 0.00111499796016897 ... 45 | 0.00158879370188017 0.00199042106393222 0.00228805569576622 ... 46 | 0.00245534154963468 0.00247186695365886 0.00232996454314494 ... 47 | 0.00203343613493045 0.00160156054722416 0.00106464066323764 ... 48 | 0.000464789604579942 -0.000151235860772574 -0.000733304467499819 ... 49 | -0.00123606394057572 -0.00162040071692578 -0.00185954669787317 ... 50 | -0.00194133868297838 -0.00186455281350489 -0.00165290903213645 ... 51 | -0.00132321370172661 -0.000928389644096508 -0.000498549297996215 ... 52 | -8.06686137619136e-05 0.000281683148107482 0.00056663832843261 ... 53 | 0.000752974827932438 0.000831017438674074 0.000810340132873889 ... 54 | 0.000712108483391345 0.000558954402278686 0.000381800229405877 ... 55 | 0.000214905085461564 8.86016232063873e-05 2.15970925174225e-05 ... 56 | 2.54452473931457e-05 0.000102114691495288 0.000243516189945656 ... 57 | 0.000428414596537098 0.000629597193713792 0.000817087660524844 ... 58 | 0.000963726196764916 0.00104440356130544 0.00104141933081865 ... 59 | 0.000946025734548229 0.000762991498849653 0.00050681707540784 ... 60 | 0.000201879978037315 -0.000124802121067749 -0.000439850320229998 ... 61 | -0.000715518199022344 -0.000921489111515442 -0.00104369214945667 ... 62 | -0.00107158841536745 -0.00101043550147316 -0.000874312333930782 ... 63 | -0.000682850390710184 -0.000463496237267545 -0.000245907062746899 ... 64 | -5.57654638128763e-05 8.33016004463481e-05 0.000157298059727724 ... 65 | 0.000163417652851349 0.000108357570736643 6.22130345541688e-06 ... 66 | -0.000120004985850942 -0.000244338584990469 -0.000340856849165411 ... 67 | -0.000386727890652857 -0.00036413852768848 -0.000265911360153111 ... 68 | -9.56167729300418e-05 0.00013299819207584 0.000398542481372163 ... 69 | 0.00067258959092237 0.000924216843429986 0.00112389144455689 ... 70 | 0.00124726186220718 0.00127750450535923 0.00120701485317963 ... 71 | 0.00104122818991195 0.000795143939641235 0.000494959911938399 ... 72 | 0.0001698439572755 -0.000146837603193026 -0.00042401808134097 ... 73 | -0.00063674053344249 -0.000767259029494064 -0.000810149655534392 ... 74 | -0.000769857026063082 -0.000660550272112195 -0.00050601097637171 ... 75 | -0.000334925300521912 -0.000176626634467005 -5.82744976658197e-05 ... 76 | 3.54460557013686e-07 -1.0857967414144e-05 -9.21309699669654e-05 ... 77 | -0.000232653641521895 -0.000411198658250568 -0.000600092633717949 ... 78 | -0.000768803766872346 -0.000887099008878146 -0.000929571375080824 ... 79 | -0.000879495148229897 -0.000730829839378788 -0.000489545120836011 ... 80 | -0.00017394567758044 0.000187299688457452 0.000559814519770569 ... 81 | 0.000906359232992611 0.00119226879218583 0.00138778487208707 ... 82 | 0.00147456426552143 0.00144529719748095 0.00130623335948495 ... 83 | 0.00107575524605721 0.000781767039083333 0.000459576622214854 ... 84 | 0.000145261220612687 -0.000126929976769509 -0.000329263874046824 ... 85 | -0.000444773108831045 -0.000469003181068826 -0.000410179786075459 ... 86 | -0.000288669487758325 -0.000132589537973004 2.48016638794034e-05 ... 87 | 0.00014978004460669 0.000213283290565898 0.000195421764829461 ... 88 | 8.71277846385453e-05 -0.000106999435333293 -0.000369435691282278 ... 89 | -0.000671492279966391 -0.000977180276253224 -0.00124677778594238 ... 90 | -0.00144314329747831 -0.00153534071431914 -0.00150355828780089 ... 91 | -0.0013411002439002 -0.00105769384191543 -0.000676102860823836 ... 92 | -0.000231686201338911 0.000233750105774306 0.00067460076808125 ... 93 | 0.0010489608712587 0.00132247220935748 0.0014726379632844 ... 94 | 0.0014918442985361 0.0013879139476711 0.00118267382896355 ... 95 | 0.000909705636970838 0.000608861652961009 0.000322446166820045 ... 96 | 8.83327106037182e-05 -6.46007754473701e-05 -0.000120022766340886 ... 97 | -7.60534235484649e-05 5.34057589958526e-05 0.00024153882750956 ... 98 | 0.000451323732411049 0.000641182562493747 0.000770531430781153 ... 99 | 0.00080563032052963 0.000723779343196941 0.000517819100199632 ... 100 | 0.000196903400666209 -0.000213967619604631 -0.00067631617842782 ... 101 | -0.00114249206462973 -0.00156179402502924 -0.00188685197792869 ... 102 | -0.00207879994291101 -0.00211305718860965 -0.00198202892414378 ... 103 | -0.00169656602917932 -0.00128494133578885 -0.000789139792058816 ... 104 | -0.000260405419926899 0.000247950107186698 0.000685677229219765 ... 105 | 0.00101256417908609 0.00120335255314622 0.00125050509943123 ... 106 | 0.00116487981070605 0.000974234375788531 0.000719014140887445 ... 107 | 0.000447341441194237 0.000207766146104695 4.30101507412732e-05 ... 108 | -1.57985268864564e-05 4.62087485043226e-05 0.000225128356668538 ... 109 | 0.000498987482952428 0.000829723540282721 0.00116819794307105 ... 110 | 0.00146073463385174 0.00165621568149936 0.00171261386921623 ... 111 | 0.00160350177593761 0.00132151003027128 0.000880630533425065 ... 112 | 0.000314727012247145 -0.000325599529563242 -0.000979666643054652 ... 113 | -0.00158276710096909 -0.00207436911658404 -0.0024056987236634 ... 114 | -0.00254541670913383 -0.00248380158302246 -0.00223355376173247 ... 115 | -0.00182877603090337 -0.00132022093085801 -0.000768922931848318 ... 116 | -0.000238756497498986 0.000211920534134381 0.000537653414595742 ... 117 | 0.000711189884544474 0.000727381714018799 0.000603282292217724 ... 118 | 0.000375881815823385 9.69427135301664e-05 -0.000173970560383575 ... 119 | -0.000377969785181649 -0.000464815686752683 -0.000400735933118763 ... 120 | -0.000172881036955175 0.000207907956725917 0.000707701528353655 ... 121 | 0.00127274449972763 0.00183672844881298 0.00232804795130597 ... 122 | 0.00267970825643838 0.00283733267352425 0.00276717019629157 ... 123 | 0.00246010221506223 0.00193452313893483 0.00123401569727873 ... 124 | 0.000422980845680688 -0.000420837060331192 -0.00121561355803282 ... 125 | -0.00188539489939478 -0.00236893007829313 -0.00262752023472654 ... 126 | -0.00264918621014181 -0.00245042682700779 -0.0020730550930257 ... 127 | -0.00157938864411663 -0.00104368684900553 -0.000542395231345026 ... 128 | -0.00014377255489376 0.00010062270506645 0.000163502771310431 ... 129 | 4.51122137159589e-05 -0.000226125753595805 -0.000597548127718081 ... 130 | -0.000998977176520116 -0.0013524214177768 -0.00158226734961679 ... 131 | -0.00162623896286873 -0.00144404397705335 -0.00102405104923416 ... 132 | -0.000386106235334779 0.00041985905750699 0.00131908586472107 ... 133 | 0.00222018841315067 0.0030263453705315 0.00364703081292596 ... 134 | 0.00400936762030455 0.00406704471117621 0.00380737078325123 ... 135 | 0.00325254949650954 0.00245808925083192 0.0015059340455678 ... 136 | 0.000494947934959459 -0.000471296419986641 -0.00129694437769511 ... 137 | -0.00190596381952195 -0.00225124306662603 -0.00232048902275608 ... 138 | -0.0021369599407738 -0.00175667897039204 -0.00126035621781129 ... 139 | -0.000742602597978786 -0.000298931173632661 -1.28238124556578e-05 ... 140 | 5.65116440890238e-05 -0.000117731960555206 -0.000525102533704015 ... 141 | -0.0011184379686099 -0.00181884112412 -0.00252569627192773 ... 142 | -0.00312915625539638 -0.00352504514379195 -0.00362833734856 ... 143 | -0.00338569425110275 -0.00278351631238203 -0.00185159591880646 ... 144 | -0.000660940004152005 0.000683277009458143 0.00205365700422301 ... 145 | 0.00331549878296931 0.0043426336009192 0.00503314466871851 ... 146 | 0.0053219765461137 0.00518877879110746 0.00466094023464689 ... 147 | 0.00381035656364015 0.00274459412427396 0.00159339058362346 ... 148 | 0.000492306101669976 -0.000434484172512492 -0.00109029134125441 ... 149 | -0.00141828233332273 -0.00140901642164944 -0.00110175637917725 ... 150 | -0.000579344758606377 4.29460819637243e-05 0.000632593561256163 ... 151 | 0.00105834759673971 0.00120851275134326 0.00100729156301277 ... 152 | 0.000426638903775299 -0.000507259059305278 -0.00171534306289911 ... 153 | -0.00307319027223928 -0.00442551398932953 -0.00560452615568813 ... 154 | -0.00645110588174172 -0.00683520257424018 -0.00667364766750201 ... 155 | -0.00594222974120174 -0.00468111446862241 -0.00299207638046581 ... 156 | -0.00102792029613376 0.00102477345274295 0.00296690277347673 ... 157 | 0.00461121674661687 0.00580465323956328 0.00644758109654794 ... 158 | 0.00650614650551551 0.00601692029734922 0.00508205608295472 ... 159 | 0.00385676411739505 0.00252908705556652 0.0012954057329596 ... 160 | 0.00033392772734608 -0.000219167097864196 -0.000289414929416928 ... 161 | 0.000124403235381756 0.000947754414287736 0.00203837211039999 ... 162 | 0.00320288915273744 0.00422173572020611 0.00487779948276268 ... 163 | 0.00498650633740616 0.00442271708676905 0.00314149327143227 ... 164 | 0.00118870819865408 -0.0012985662094508 -0.00410420725440432 ... 165 | -0.00695501346666282 -0.00955179445989282 -0.0116041478867957 ... 166 | -0.0128667213042378 -0.0131703326327861 -0.0124459822775461 ... 167 | -0.0107365596111877 -0.00819567088522479 -0.00507247479622976 ... 168 | -0.00168454725398517 0.00161955783172027 0.00450182489481855 ... 169 | 0.00667734616387153 0.0079510099151643 0.00824476822354623 ... 170 | 0.00761019367806528 0.00622600033387734 0.00437814465879763 ... 171 | 0.00242582493169667 0.000755676146625718 -0.000269317815613622 ... 172 | -0.000361724454472118 0.000645783038896334 0.00276769679977573 ... 173 | 0.00585055603469276 0.00957728730912253 0.0134933354578465 ... 174 | 0.017050851570732 0.019668218610711 0.0207980516183748 ... 175 | 0.0199968851080923 0.016987814201718 0.0117092270055593 ... 176 | 0.00434240225380422 -0.00468565127212598 -0.0147261908649202 ... 177 | -0.024958236294348 -0.0344602329905804 -0.0422961986994441 ... 178 | -0.0476092008608115 -0.0497113373163834 -0.0481616612307747 ... 179 | -0.0428229932331479 -0.0338909278290166 -0.0218910978167643 ... 180 | -0.0076443301765924 0.00779828985197979 0.0232445587989121 ... 181 | 0.0374658740388958 0.0493077648744371 0.0577955816888893 ... 182 | 0.0622243741345219 0.0622243741345219 0.0577955816888893 ... 183 | 0.0493077648744371 0.0374658740388958 0.0232445587989121 ... 184 | 0.00779828985197979 -0.0076443301765924 -0.0218910978167643 ... 185 | -0.0338909278290166 -0.0428229932331479 -0.0481616612307747 ... 186 | -0.0497113373163834 -0.0476092008608115 -0.0422961986994441 ... 187 | -0.0344602329905804 -0.024958236294348 -0.0147261908649202 ... 188 | -0.00468565127212598 0.00434240225380422 0.0117092270055593 ... 189 | 0.016987814201718 0.0199968851080923 0.0207980516183748 ... 190 | 0.019668218610711 0.017050851570732 0.0134933354578465 ... 191 | 0.00957728730912253 0.00585055603469276 0.00276769679977573 ... 192 | 0.000645783038896334 -0.000361724454472118 -0.000269317815613622 ... 193 | 0.000755676146625718 0.00242582493169667 0.00437814465879763 ... 194 | 0.00622600033387734 0.00761019367806528 0.00824476822354623 ... 195 | 0.0079510099151643 0.00667734616387153 0.00450182489481855 ... 196 | 0.00161955783172027 -0.00168454725398517 -0.00507247479622976 ... 197 | -0.00819567088522479 -0.0107365596111877 -0.0124459822775461 ... 198 | -0.0131703326327861 -0.0128667213042378 -0.0116041478867957 ... 199 | -0.00955179445989282 -0.00695501346666282 -0.00410420725440432 ... 200 | -0.0012985662094508 0.00118870819865408 0.00314149327143227 ... 201 | 0.00442271708676905 0.00498650633740616 0.00487779948276268 ... 202 | 0.00422173572020611 0.00320288915273744 0.00203837211039999 ... 203 | 0.000947754414287736 0.000124403235381756 -0.000289414929416928 ... 204 | -0.000219167097864196 0.00033392772734608 0.0012954057329596 ... 205 | 0.00252908705556652 0.00385676411739505 0.00508205608295472 ... 206 | 0.00601692029734922 0.00650614650551551 0.00644758109654794 ... 207 | 0.00580465323956328 0.00461121674661687 0.00296690277347673 ... 208 | 0.00102477345274295 -0.00102792029613376 -0.00299207638046581 ... 209 | -0.00468111446862241 -0.00594222974120174 -0.00667364766750201 ... 210 | -0.00683520257424018 -0.00645110588174172 -0.00560452615568813 ... 211 | -0.00442551398932953 -0.00307319027223928 -0.00171534306289911 ... 212 | -0.000507259059305278 0.000426638903775299 0.00100729156301277 ... 213 | 0.00120851275134326 0.00105834759673971 0.000632593561256163 ... 214 | 4.29460819637243e-05 -0.000579344758606377 -0.00110175637917725 ... 215 | -0.00140901642164944 -0.00141828233332273 -0.00109029134125441 ... 216 | -0.000434484172512492 0.000492306101669976 0.00159339058362346 ... 217 | 0.00274459412427396 0.00381035656364015 0.00466094023464689 ... 218 | 0.00518877879110746 0.0053219765461137 0.00503314466871851 ... 219 | 0.0043426336009192 0.00331549878296931 0.00205365700422301 ... 220 | 0.000683277009458143 -0.000660940004152005 -0.00185159591880646 ... 221 | -0.00278351631238203 -0.00338569425110275 -0.00362833734856 ... 222 | -0.00352504514379195 -0.00312915625539638 -0.00252569627192773 ... 223 | -0.00181884112412 -0.0011184379686099 -0.000525102533704015 ... 224 | -0.000117731960555206 5.65116440890238e-05 -1.28238124556578e-05 ... 225 | -0.000298931173632661 -0.000742602597978786 -0.00126035621781129 ... 226 | -0.00175667897039204 -0.0021369599407738 -0.00232048902275608 ... 227 | -0.00225124306662603 -0.00190596381952195 -0.00129694437769511 ... 228 | -0.000471296419986641 0.000494947934959459 0.0015059340455678 ... 229 | 0.00245808925083192 0.00325254949650954 0.00380737078325123 ... 230 | 0.00406704471117621 0.00400936762030455 0.00364703081292596 ... 231 | 0.0030263453705315 0.00222018841315067 0.00131908586472107 ... 232 | 0.00041985905750699 -0.000386106235334779 -0.00102405104923416 ... 233 | -0.00144404397705335 -0.00162623896286873 -0.00158226734961679 ... 234 | -0.0013524214177768 -0.000998977176520116 -0.000597548127718081 ... 235 | -0.000226125753595805 4.51122137159589e-05 0.000163502771310431 ... 236 | 0.00010062270506645 -0.00014377255489376 -0.000542395231345026 ... 237 | -0.00104368684900553 -0.00157938864411663 -0.0020730550930257 ... 238 | -0.00245042682700779 -0.00264918621014181 -0.00262752023472654 ... 239 | -0.00236893007829313 -0.00188539489939478 -0.00121561355803282 ... 240 | -0.000420837060331192 0.000422980845680688 0.00123401569727873 ... 241 | 0.00193452313893483 0.00246010221506223 0.00276717019629157 ... 242 | 0.00283733267352425 0.00267970825643838 0.00232804795130597 ... 243 | 0.00183672844881298 0.00127274449972763 0.000707701528353655 ... 244 | 0.000207907956725917 -0.000172881036955175 -0.000400735933118763 ... 245 | -0.000464815686752683 -0.000377969785181649 -0.000173970560383575 ... 246 | 9.69427135301664e-05 0.000375881815823385 0.000603282292217724 ... 247 | 0.000727381714018799 0.000711189884544474 0.000537653414595742 ... 248 | 0.000211920534134381 -0.000238756497498986 -0.000768922931848318 ... 249 | -0.00132022093085801 -0.00182877603090337 -0.00223355376173247 ... 250 | -0.00248380158302246 -0.00254541670913383 -0.0024056987236634 ... 251 | -0.00207436911658404 -0.00158276710096909 -0.000979666643054652 ... 252 | -0.000325599529563242 0.000314727012247145 0.000880630533425065 ... 253 | 0.00132151003027128 0.00160350177593761 0.00171261386921623 ... 254 | 0.00165621568149936 0.00146073463385174 0.00116819794307105 ... 255 | 0.000829723540282721 0.000498987482952428 0.000225128356668538 ... 256 | 4.62087485043226e-05 -1.57985268864564e-05 4.30101507412732e-05 ... 257 | 0.000207766146104695 0.000447341441194237 0.000719014140887445 ... 258 | 0.000974234375788531 0.00116487981070605 0.00125050509943123 ... 259 | 0.00120335255314622 0.00101256417908609 0.000685677229219765 ... 260 | 0.000247950107186698 -0.000260405419926899 -0.000789139792058816 ... 261 | -0.00128494133578885 -0.00169656602917932 -0.00198202892414378 ... 262 | -0.00211305718860965 -0.00207879994291101 -0.00188685197792869 ... 263 | -0.00156179402502924 -0.00114249206462973 -0.00067631617842782 ... 264 | -0.000213967619604631 0.000196903400666209 0.000517819100199632 ... 265 | 0.000723779343196941 0.00080563032052963 0.000770531430781153 ... 266 | 0.000641182562493747 0.000451323732411049 0.00024153882750956 ... 267 | 5.34057589958526e-05 -7.60534235484649e-05 -0.000120022766340886 ... 268 | -6.46007754473701e-05 8.83327106037182e-05 0.000322446166820045 ... 269 | 0.000608861652961009 0.000909705636970838 0.00118267382896355 ... 270 | 0.0013879139476711 0.0014918442985361 0.0014726379632844 ... 271 | 0.00132247220935748 0.0010489608712587 0.00067460076808125 ... 272 | 0.000233750105774306 -0.000231686201338911 -0.000676102860823836 ... 273 | -0.00105769384191543 -0.0013411002439002 -0.00150355828780089 ... 274 | -0.00153534071431914 -0.00144314329747831 -0.00124677778594238 ... 275 | -0.000977180276253224 -0.000671492279966391 -0.000369435691282278 ... 276 | -0.000106999435333293 8.71277846385453e-05 0.000195421764829461 ... 277 | 0.000213283290565898 0.00014978004460669 2.48016638794034e-05 ... 278 | -0.000132589537973004 -0.000288669487758325 -0.000410179786075459 ... 279 | -0.000469003181068826 -0.000444773108831045 -0.000329263874046824 ... 280 | -0.000126929976769509 0.000145261220612687 0.000459576622214854 ... 281 | 0.000781767039083333 0.00107575524605721 0.00130623335948495 ... 282 | 0.00144529719748095 0.00147456426552143 0.00138778487208707 ... 283 | 0.00119226879218583 0.000906359232992611 0.000559814519770569 ... 284 | 0.000187299688457452 -0.00017394567758044 -0.000489545120836011 ... 285 | -0.000730829839378788 -0.000879495148229897 -0.000929571375080824 ... 286 | -0.000887099008878146 -0.000768803766872346 -0.000600092633717949 ... 287 | -0.000411198658250568 -0.000232653641521895 -9.21309699669654e-05 ... 288 | -1.0857967414144e-05 3.54460557013686e-07 -5.82744976658197e-05 ... 289 | -0.000176626634467005 -0.000334925300521912 -0.00050601097637171 ... 290 | -0.000660550272112195 -0.000769857026063082 -0.000810149655534392 ... 291 | -0.000767259029494064 -0.00063674053344249 -0.00042401808134097 ... 292 | -0.000146837603193026 0.0001698439572755 0.000494959911938399 ... 293 | 0.000795143939641235 0.00104122818991195 0.00120701485317963 ... 294 | 0.00127750450535923 0.00124726186220718 0.00112389144455689 ... 295 | 0.000924216843429986 0.00067258959092237 0.000398542481372163 ... 296 | 0.00013299819207584 -9.56167729300418e-05 -0.000265911360153111 ... 297 | -0.00036413852768848 -0.000386727890652857 -0.000340856849165411 ... 298 | -0.000244338584990469 -0.000120004985850942 6.22130345541688e-06 ... 299 | 0.000108357570736643 0.000163417652851349 0.000157298059727724 ... 300 | 8.33016004463481e-05 -5.57654638128763e-05 -0.000245907062746899 ... 301 | -0.000463496237267545 -0.000682850390710184 -0.000874312333930782 ... 302 | -0.00101043550147316 -0.00107158841536745 -0.00104369214945667 ... 303 | -0.000921489111515442 -0.000715518199022344 -0.000439850320229998 ... 304 | -0.000124802121067749 0.000201879978037315 0.00050681707540784 ... 305 | 0.000762991498849653 0.000946025734548229 0.00104141933081865 ... 306 | 0.00104440356130544 0.000963726196764916 0.000817087660524844 ... 307 | 0.000629597193713792 0.000428414596537098 0.000243516189945656 ... 308 | 0.000102114691495288 2.54452473931457e-05 2.15970925174225e-05 ... 309 | 8.86016232063873e-05 0.000214905085461564 0.000381800229405877 ... 310 | 0.000558954402278686 0.000712108483391345 0.000810340132873889 ... 311 | 0.000831017438674074 0.000752974827932438 0.00056663832843261 ... 312 | 0.000281683148107482 -8.06686137619136e-05 -0.000498549297996215 ... 313 | -0.000928389644096508 -0.00132321370172661 -0.00165290903213645 ... 314 | -0.00186455281350489 -0.00194133868297838 -0.00185954669787317 ... 315 | -0.00162040071692578 -0.00123606394057572 -0.000733304467499819 ... 316 | -0.000151235860772574 0.000464789604579942 0.00106464066323764 ... 317 | 0.00160156054722416 0.00203343613493045 0.00232996454314494 ... 318 | 0.00247186695365886 0.00245534154963468 0.00228805569576622 ... 319 | 0.00199042106393222 0.00158879370188017 0.00111499796016897 ... 320 | 0.000599082943233155 7.01502854637626e-05 -0.000447793739480768 ... 321 | -0.000930213854910791 -0.00135063007552091 -0.00166979884539573 ... 322 | -0.00183121533693241 -0.00175190210005007 -0.00132696181743952 ... 323 | -0.000438850868031051 0.00100889182085265 0.00304400411355789 ... 324 | -0.00328662612537043]); 325 | end 326 | 327 | y = step(Hd,double(x)); 328 | 329 | 330 | % [EOF] 331 | -------------------------------------------------------------------------------- /bandPassFilter12G38G.m: -------------------------------------------------------------------------------- 1 | function y = bandPassFilter12G38G(x) 2 | %BANDPASSFILTER12G38G Filters input x and returns output y. 3 | 4 | % MATLAB Code 5 | % Generated by MATLAB(R) 9.1 and the DSP System Toolbox 9.3. 6 | % Generated on: 28-Jul-2017 14:14:10 7 | 8 | %#codegen 9 | 10 | % To generate C/C++ code from this function use the codegen command. Type 11 | % 'help codegen' for more information. 12 | 13 | persistent Hd; 14 | 15 | if isempty(Hd) 16 | 17 | % The following code was used to design the filter coefficients: 18 | % % Equiripple Bandpass filter designed using the FIRPM function. 19 | % 20 | % % All frequency values are in GHz. 21 | % Fs = 600; % Sampling Frequency 22 | % 23 | % Fstop1 = 11; % First Stopband Frequency 24 | % Fpass1 = 12; % First Passband Frequency 25 | % Fpass2 = 38; % Second Passband Frequency 26 | % Fstop2 = 39; % Second Stopband Frequency 27 | % Dstop1 = 0.01; % First Stopband Attenuation 28 | % Dpass = 0.057501127785; % Passband Ripple 29 | % Dstop2 = 0.01; % Second Stopband Attenuation 30 | % dens = 20; % Density Factor 31 | % 32 | % % Calculate the order from the parameters using FIRPMORD. 33 | % [N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ... 34 | % 0], [Dstop1 Dpass Dstop2]); 35 | % 36 | % % Calculate the coefficients using the FIRPM function. 37 | % b = firpm(N, Fo, Ao, W, {dens}); 38 | 39 | Hd = dsp.FIRFilter( ... 40 | 'Numerator', [0.00441355600153117 -0.00186851816397141 ... 41 | -0.00157370713114779 -0.00134843843172702 -0.00117137124297013 ... 42 | -0.0010107443034646 -0.000862114418365961 -0.000712726807495988 ... 43 | -0.000577035216303767 -0.000458292846564782 -0.0003816461205007 ... 44 | -0.000353545485975799 -0.000394179580544488 -0.000496899333793406 ... 45 | -0.000662713612794409 -0.000862130982321538 -0.00107386143967476 ... 46 | -0.00124993663037054 -0.00135886579937377 -0.00135240424690182 ... 47 | -0.0012114325405598 -0.000910323983903008 -0.000463578741140334 ... 48 | 0.000117220153030299 0.000779724453430603 0.00147102389173814 ... 49 | 0.00212920622287149 0.0026744932687209 0.00305067423893676 ... 50 | 0.0032172861845596 0.00313705089397488 0.0028145334147178 ... 51 | 0.0022707550011296 0.0015636605122513 0.000752988044242502 ... 52 | -7.67217364537999e-05 -0.000853338810487761 -0.00149634900145798 ... 53 | -0.00195693426079309 -0.00219418161359554 -0.00221004575422702 ... 54 | -0.002017236905325 -0.00166745545718656 -0.00121232311086121 ... 55 | -0.000728040883331772 -0.000272813899063807 8.73201469754458e-05 ... 56 | 0.000321115610522015 0.000399943444625612 0.000336501435816117 ... 57 | 0.000147883148801144 -0.000119583148643723 -0.000418648226511807 ... 58 | -0.000693177160645144 -0.000903766902394608 -0.00100875558385843 ... 59 | -0.00100006055139718 -0.000874321142778759 -0.000658580757554115 ... 60 | -0.000378573620663888 -8.33641642906061e-05 0.000191937587439258 ... 61 | 0.000404014834464624 0.000536706886217158 0.000573536786512098 ... 62 | 0.000528894501482778 0.000416214572303194 0.000275080671860863 ... 63 | 0.000134492374813304 3.73914030709788e-05 2.84290364384147e-06 ... 64 | 5.36711665057605e-05 0.000181057233804151 0.000378473075186087 ... 65 | 0.000609593950013892 0.00084639122956572 0.00104366851800283 ... 66 | 0.00117305271532155 0.00120409027056389 0.00113315427677536 ... 67 | 0.000957920423536317 0.000706959534604148 0.000406087327598929 ... 68 | 0.000101859272868335 -0.000172586318883111 -0.000374723448002457 ... 69 | -0.000488291423316057 -0.000497679147040258 -0.000418096411620716 ... 70 | -0.000264866620382325 -7.97707623321105e-05 0.00010397416415684 ... 71 | 0.000238970209283056 0.000300152076643192 0.000260150732111351 ... 72 | 0.000122642674771688 -0.000107297154159663 -0.000393624800223724 ... 73 | -0.000705418250258672 -0.000990638264621241 -0.00121536741674112 ... 74 | -0.00133949776678719 -0.0013508056561749 -0.00124088094652763 ... 75 | -0.00103218319469495 -0.000747926712404859 -0.000436731328019749 ... 76 | -0.00013640388116154 0.000104535760632245 0.000261396848418661 ... 77 | 0.000310142715254736 0.000259094748665028 0.000119751902365763 ... 78 | -6.78972379290609e-05 -0.000268918761323122 -0.000431513003764218 ... 79 | -0.000523129536161816 -0.000508766312272604 -0.000384112402664683 ... 80 | -0.000149011709285902 0.000164532208657912 0.000524819540649428 ... 81 | 0.000877046137804631 0.00118088263755 0.00138755940286476 ... 82 | 0.00147681808774561 0.00143146564868001 0.00126769686696591 ... 83 | 0.00100649396470428 0.000696166259980961 0.000378366270363941 ... 84 | 0.000108535624328135 -8.04092084326583e-05 -0.000156490767794844 ... 85 | -0.000120040080564369 2.23312416806187e-05 0.00023202693082401 ... 86 | 0.000471402208790895 0.000683507268585274 0.000827404464007775 ... 87 | 0.000858761292792778 0.000763672984825566 0.000535078367846402 ... 88 | 0.000200165612188398 -0.00020948176359988 -0.000636331274167151 ... 89 | -0.00103201615511076 -0.00133848754042219 -0.00152421725956339 ... 90 | -0.00156168788103989 -0.0014593324308138 -0.00123316843216536 ... 91 | -0.00093076792413239 -0.000598125198202694 -0.000297344022495656 ... 92 | -7.13422752938843e-05 3.7207200625178e-05 1.89977204034719e-05 ... 93 | -0.000125910149574876 -0.000362676298173467 -0.000652096781265773 ... 94 | -0.000931643985477384 -0.00115100266157657 -0.00125504889725404 ... 95 | -0.00121775095724189 -0.00102196681450541 -0.000687627978958029 ... 96 | -0.000244194379228427 0.000249075645318178 0.00073656286747284 ... 97 | 0.00115039463631262 0.00144571061974221 0.00158304807726546 ... 98 | 0.00155962639372231 0.00138436775884553 0.00110225166510993 ... 99 | 0.000761812721725181 0.000432148073507337 0.00016744175505828 ... 100 | 2.19939355821262e-05 1.74036768914518e-05 0.000163090674713188 ... 101 | 0.000429891458439764 0.000778683858845478 0.00114268243581356 ... 102 | 0.00146157429683154 0.00166758426354622 0.00172032070023352 ... 103 | 0.00158991243665027 0.00128564832641177 0.000831877941347418 ... 104 | 0.000287841116282626 -0.000284585429523636 -0.00080741790828161 ... 105 | -0.00122137372149596 -0.00147255967554081 -0.00154382233228169 ... 106 | -0.00143470718708419 -0.00118457779739524 -0.000843022243028721 ... 107 | -0.000485487921272496 -0.000177602067978723 1.25733084470258e-05 ... 108 | 4.83154867641821e-05 -9.17422498878783e-05 -0.000387425802939722 ... 109 | -0.000802196492770649 -0.00126592047311237 -0.00170841055455113 ... 110 | -0.00204842720343394 -0.00222855470364227 -0.00220275738924599 ... 111 | -0.00196620649475774 -0.00153465368459587 -0.000964173480329185 ... 112 | -0.0003212766739556 0.000305877374759398 0.000842625871704391 ... 113 | 0.00121830973967525 0.00139838349321894 0.00136930665284934 ... 114 | 0.00116150976163652 0.000823734922510885 0.000436145474572452 ... 115 | 7.6305116551531e-05 -0.000172129632038651 -0.000254589541956562 ... 116 | -0.000133922228891963 0.000182444139588145 0.000663332052971811 ... 117 | 0.00123785333921542 0.00182666938063629 0.00233381191428024 ... 118 | 0.0026824129581446 0.00280690225904482 0.00268368433364034 ... 119 | 0.00231562594888004 0.00175214654792239 0.00106191994799558 ... 120 | 0.000342108929584859 -0.0003162447120416 -0.000823129604064635 ... 121 | -0.00112324013428433 -0.00118568844776246 -0.00102800887702736 ... 122 | -0.00069488202036245 -0.000269597094943327 0.000157946667575108 ... 123 | 0.000487138817810974 0.00064199508009805 0.000565033301052922 ... 124 | 0.000246340415501768 -0.000292739974212435 -0.000983719945704048 ... 125 | -0.00173924895248569 -0.00244828683712233 -0.0030117534575416 ... 126 | -0.00333997731580247 -0.00338548298868814 -0.00313292527107948 ... 127 | -0.00261984432491277 -0.00191364840283176 -0.00111909801486051 ... 128 | -0.000344212102584589 0.000299114706727212 0.000730303733455097 ... 129 | 0.000895908234736863 0.000795679726307197 0.000465829788107814 ... 130 | -9.71576008483317e-06 -0.000529124174398405 -0.000972735605134739 ... 131 | -0.00123890817226786 -0.00124460912752514 -0.000956117255263543 ... 132 | -0.000379085004828967 0.000424612981723665 0.0013620289273184 ... 133 | 0.00230692475493964 0.00313500232846411 0.00372765004552355 ... 134 | 0.00400675895760858 0.00393156910212465 0.0035215150067423 ... 135 | 0.00283809426235164 0.00199107572592877 0.00110620614423503 ... 136 | 0.000320605386859921 -0.000254495877967663 -0.000536560818095057 ... 137 | -0.000500450057467334 -0.000168220181509329 0.000378988170036676 ... 138 | 0.0010282494209826 0.00163824887908061 0.00207625921433712 ... 139 | 0.00222608068354664 0.00202159184604834 0.00144479622060794 ... 140 | 0.000544214684216995 -0.000585252965590996 -0.00180205195188014 ... 141 | -0.00295326761371901 -0.00388466454429864 -0.00447835643701737 ... 142 | -0.00465857130615534 -0.00441756105095932 -0.00380409813288574 ... 143 | -0.0029297454170574 -0.00193851729794414 -0.000997131884455753 ... 144 | -0.000255520857642783 0.000164871682121036 0.00020410351955294 ... 145 | -0.000138383838483862 -0.000789916971178259 -0.00162755304647254 ... 146 | -0.00248470847756338 -0.00318989224963798 -0.00358239952368077 ... 147 | -0.00355078048219473 -0.00304076179744911 -0.00207730582881543 ... 148 | -0.0007514082543747 0.000780908786981016 0.00233306372883277 ... 149 | 0.00370502256923846 0.00472578288295668 0.00526960169546096 ... 150 | 0.00528731362714702 0.00480445917999156 0.0039288719327581 ... 151 | 0.00282368133356024 0.00169253397668918 0.000736628744234845 ... 152 | 0.00013215603582555 -9.25328400486116e-06 0.000349890082321728 ... 153 | 0.00115478752064976 0.00227504327231013 0.00351373606562532 ... 154 | 0.00464750284389091 0.00545229061307332 0.00574951023600389 ... 155 | 0.00542670731527322 0.00446724713945515 0.00294712883164342 ... 156 | 0.00103477181997054 -0.00104168888347576 -0.00301975984152654 ... 157 | -0.0046517633396101 -0.00573532683002536 -0.00615483369365463 ... 158 | -0.00589291447138742 -0.00504316346626059 -0.0037891415845284 ... 159 | -0.00238444440573508 -0.00110481333259328 -0.000211540419831316 ... 160 | 9.98395081927709e-05 -0.000273791642614322 -0.00131545764468385 ... 161 | -0.00289383813531161 -0.00477276433503895 -0.00665283331719949 ... 162 | -0.00820989820672271 -0.00915353271751615 -0.00926781890755895 ... 163 | -0.00845589366515759 -0.00675302881169255 -0.0043329565381314 ... 164 | -0.00147920271415135 0.00144948780227816 0.00407922920951518 ... 165 | 0.00607325386708158 0.00719238354259494 0.00732999025194033 ... 166 | 0.0065389352067878 0.00502235705966584 0.00311120909414423 ... 167 | 0.00120962214100008 -0.00026322894313479 -0.000946757158031066 ... 168 | -0.000595889550445974 0.000867452233142299 0.00333711802333145 ... 169 | 0.00652456436187785 0.00999906385409933 0.0132434492793068 ... 170 | 0.0157355933592811 0.0170259782914805 0.0168168116652252 ... 171 | 0.0150129163049516 0.011752153411042 0.00739260459914801 ... 172 | 0.00247276622542218 -0.00236650516682364 -0.00647349032034802 ... 173 | -0.00929107489729222 -0.0104473173019083 -0.00982987487568419 ... 174 | -0.00761855864556878 -0.00428129043041928 -0.000519406754297763 ... 175 | 0.00282115812767937 0.00487273792305238 0.00487691550117553 ... 176 | 0.00231486289559252 -0.00299170757852051 -0.0108155986787147 ... 177 | -0.0205159438720467 -0.031083359133637 -0.041242935327284 ... 178 | -0.0495976793051515 -0.0548020969012403 -0.0557379231685972 ... 179 | -0.0516751526952099 -0.0423907719498389 -0.0282334345067581 ... 180 | -0.010118128232158 0.0105461497288089 0.031993469997723 ... 181 | 0.0522842216309082 0.069515690520158 0.0820327568904954 ... 182 | 0.0886149547098444 0.0886149547098444 0.0820327568904954 ... 183 | 0.069515690520158 0.0522842216309082 0.031993469997723 ... 184 | 0.0105461497288089 -0.010118128232158 -0.0282334345067581 ... 185 | -0.0423907719498389 -0.0516751526952099 -0.0557379231685972 ... 186 | -0.0548020969012403 -0.0495976793051515 -0.041242935327284 ... 187 | -0.031083359133637 -0.0205159438720467 -0.0108155986787147 ... 188 | -0.00299170757852051 0.00231486289559252 0.00487691550117553 ... 189 | 0.00487273792305238 0.00282115812767937 -0.000519406754297763 ... 190 | -0.00428129043041928 -0.00761855864556878 -0.00982987487568419 ... 191 | -0.0104473173019083 -0.00929107489729222 -0.00647349032034802 ... 192 | -0.00236650516682364 0.00247276622542218 0.00739260459914801 ... 193 | 0.011752153411042 0.0150129163049516 0.0168168116652252 ... 194 | 0.0170259782914805 0.0157355933592811 0.0132434492793068 ... 195 | 0.00999906385409933 0.00652456436187785 0.00333711802333145 ... 196 | 0.000867452233142299 -0.000595889550445974 -0.000946757158031066 ... 197 | -0.00026322894313479 0.00120962214100008 0.00311120909414423 ... 198 | 0.00502235705966584 0.0065389352067878 0.00732999025194033 ... 199 | 0.00719238354259494 0.00607325386708158 0.00407922920951518 ... 200 | 0.00144948780227816 -0.00147920271415135 -0.0043329565381314 ... 201 | -0.00675302881169255 -0.00845589366515759 -0.00926781890755895 ... 202 | -0.00915353271751615 -0.00820989820672271 -0.00665283331719949 ... 203 | -0.00477276433503895 -0.00289383813531161 -0.00131545764468385 ... 204 | -0.000273791642614322 9.98395081927709e-05 -0.000211540419831316 ... 205 | -0.00110481333259328 -0.00238444440573508 -0.0037891415845284 ... 206 | -0.00504316346626059 -0.00589291447138742 -0.00615483369365463 ... 207 | -0.00573532683002536 -0.0046517633396101 -0.00301975984152654 ... 208 | -0.00104168888347576 0.00103477181997054 0.00294712883164342 ... 209 | 0.00446724713945515 0.00542670731527322 0.00574951023600389 ... 210 | 0.00545229061307332 0.00464750284389091 0.00351373606562532 ... 211 | 0.00227504327231013 0.00115478752064976 0.000349890082321728 ... 212 | -9.25328400486116e-06 0.00013215603582555 0.000736628744234845 ... 213 | 0.00169253397668918 0.00282368133356024 0.0039288719327581 ... 214 | 0.00480445917999156 0.00528731362714702 0.00526960169546096 ... 215 | 0.00472578288295668 0.00370502256923846 0.00233306372883277 ... 216 | 0.000780908786981016 -0.0007514082543747 -0.00207730582881543 ... 217 | -0.00304076179744911 -0.00355078048219473 -0.00358239952368077 ... 218 | -0.00318989224963798 -0.00248470847756338 -0.00162755304647254 ... 219 | -0.000789916971178259 -0.000138383838483862 0.00020410351955294 ... 220 | 0.000164871682121036 -0.000255520857642783 -0.000997131884455753 ... 221 | -0.00193851729794414 -0.0029297454170574 -0.00380409813288574 ... 222 | -0.00441756105095932 -0.00465857130615534 -0.00447835643701737 ... 223 | -0.00388466454429864 -0.00295326761371901 -0.00180205195188014 ... 224 | -0.000585252965590996 0.000544214684216995 0.00144479622060794 ... 225 | 0.00202159184604834 0.00222608068354664 0.00207625921433712 ... 226 | 0.00163824887908061 0.0010282494209826 0.000378988170036676 ... 227 | -0.000168220181509329 -0.000500450057467334 -0.000536560818095057 ... 228 | -0.000254495877967663 0.000320605386859921 0.00110620614423503 ... 229 | 0.00199107572592877 0.00283809426235164 0.0035215150067423 ... 230 | 0.00393156910212465 0.00400675895760858 0.00372765004552355 ... 231 | 0.00313500232846411 0.00230692475493964 0.0013620289273184 ... 232 | 0.000424612981723665 -0.000379085004828967 -0.000956117255263543 ... 233 | -0.00124460912752514 -0.00123890817226786 -0.000972735605134739 ... 234 | -0.000529124174398405 -9.71576008483317e-06 0.000465829788107814 ... 235 | 0.000795679726307197 0.000895908234736863 0.000730303733455097 ... 236 | 0.000299114706727212 -0.000344212102584589 -0.00111909801486051 ... 237 | -0.00191364840283176 -0.00261984432491277 -0.00313292527107948 ... 238 | -0.00338548298868814 -0.00333997731580247 -0.0030117534575416 ... 239 | -0.00244828683712233 -0.00173924895248569 -0.000983719945704048 ... 240 | -0.000292739974212435 0.000246340415501768 0.000565033301052922 ... 241 | 0.00064199508009805 0.000487138817810974 0.000157946667575108 ... 242 | -0.000269597094943327 -0.00069488202036245 -0.00102800887702736 ... 243 | -0.00118568844776246 -0.00112324013428433 -0.000823129604064635 ... 244 | -0.0003162447120416 0.000342108929584859 0.00106191994799558 ... 245 | 0.00175214654792239 0.00231562594888004 0.00268368433364034 ... 246 | 0.00280690225904482 0.0026824129581446 0.00233381191428024 ... 247 | 0.00182666938063629 0.00123785333921542 0.000663332052971811 ... 248 | 0.000182444139588145 -0.000133922228891963 -0.000254589541956562 ... 249 | -0.000172129632038651 7.6305116551531e-05 0.000436145474572452 ... 250 | 0.000823734922510885 0.00116150976163652 0.00136930665284934 ... 251 | 0.00139838349321894 0.00121830973967525 0.000842625871704391 ... 252 | 0.000305877374759398 -0.0003212766739556 -0.000964173480329185 ... 253 | -0.00153465368459587 -0.00196620649475774 -0.00220275738924599 ... 254 | -0.00222855470364227 -0.00204842720343394 -0.00170841055455113 ... 255 | -0.00126592047311237 -0.000802196492770649 -0.000387425802939722 ... 256 | -9.17422498878783e-05 4.83154867641821e-05 1.25733084470258e-05 ... 257 | -0.000177602067978723 -0.000485487921272496 -0.000843022243028721 ... 258 | -0.00118457779739524 -0.00143470718708419 -0.00154382233228169 ... 259 | -0.00147255967554081 -0.00122137372149596 -0.00080741790828161 ... 260 | -0.000284585429523636 0.000287841116282626 0.000831877941347418 ... 261 | 0.00128564832641177 0.00158991243665027 0.00172032070023352 ... 262 | 0.00166758426354622 0.00146157429683154 0.00114268243581356 ... 263 | 0.000778683858845478 0.000429891458439764 0.000163090674713188 ... 264 | 1.74036768914518e-05 2.19939355821262e-05 0.00016744175505828 ... 265 | 0.000432148073507337 0.000761812721725181 0.00110225166510993 ... 266 | 0.00138436775884553 0.00155962639372231 0.00158304807726546 ... 267 | 0.00144571061974221 0.00115039463631262 0.00073656286747284 ... 268 | 0.000249075645318178 -0.000244194379228427 -0.000687627978958029 ... 269 | -0.00102196681450541 -0.00121775095724189 -0.00125504889725404 ... 270 | -0.00115100266157657 -0.000931643985477384 -0.000652096781265773 ... 271 | -0.000362676298173467 -0.000125910149574876 1.89977204034719e-05 ... 272 | 3.7207200625178e-05 -7.13422752938843e-05 -0.000297344022495656 ... 273 | -0.000598125198202694 -0.00093076792413239 -0.00123316843216536 ... 274 | -0.0014593324308138 -0.00156168788103989 -0.00152421725956339 ... 275 | -0.00133848754042219 -0.00103201615511076 -0.000636331274167151 ... 276 | -0.00020948176359988 0.000200165612188398 0.000535078367846402 ... 277 | 0.000763672984825566 0.000858761292792778 0.000827404464007775 ... 278 | 0.000683507268585274 0.000471402208790895 0.00023202693082401 ... 279 | 2.23312416806187e-05 -0.000120040080564369 -0.000156490767794844 ... 280 | -8.04092084326583e-05 0.000108535624328135 0.000378366270363941 ... 281 | 0.000696166259980961 0.00100649396470428 0.00126769686696591 ... 282 | 0.00143146564868001 0.00147681808774561 0.00138755940286476 ... 283 | 0.00118088263755 0.000877046137804631 0.000524819540649428 ... 284 | 0.000164532208657912 -0.000149011709285902 -0.000384112402664683 ... 285 | -0.000508766312272604 -0.000523129536161816 -0.000431513003764218 ... 286 | -0.000268918761323122 -6.78972379290609e-05 0.000119751902365763 ... 287 | 0.000259094748665028 0.000310142715254736 0.000261396848418661 ... 288 | 0.000104535760632245 -0.00013640388116154 -0.000436731328019749 ... 289 | -0.000747926712404859 -0.00103218319469495 -0.00124088094652763 ... 290 | -0.0013508056561749 -0.00133949776678719 -0.00121536741674112 ... 291 | -0.000990638264621241 -0.000705418250258672 -0.000393624800223724 ... 292 | -0.000107297154159663 0.000122642674771688 0.000260150732111351 ... 293 | 0.000300152076643192 0.000238970209283056 0.00010397416415684 ... 294 | -7.97707623321105e-05 -0.000264866620382325 -0.000418096411620716 ... 295 | -0.000497679147040258 -0.000488291423316057 -0.000374723448002457 ... 296 | -0.000172586318883111 0.000101859272868335 0.000406087327598929 ... 297 | 0.000706959534604148 0.000957920423536317 0.00113315427677536 ... 298 | 0.00120409027056389 0.00117305271532155 0.00104366851800283 ... 299 | 0.00084639122956572 0.000609593950013892 0.000378473075186087 ... 300 | 0.000181057233804151 5.36711665057605e-05 2.84290364384147e-06 ... 301 | 3.73914030709788e-05 0.000134492374813304 0.000275080671860863 ... 302 | 0.000416214572303194 0.000528894501482778 0.000573536786512098 ... 303 | 0.000536706886217158 0.000404014834464624 0.000191937587439258 ... 304 | -8.33641642906061e-05 -0.000378573620663888 -0.000658580757554115 ... 305 | -0.000874321142778759 -0.00100006055139718 -0.00100875558385843 ... 306 | -0.000903766902394608 -0.000693177160645144 -0.000418648226511807 ... 307 | -0.000119583148643723 0.000147883148801144 0.000336501435816117 ... 308 | 0.000399943444625612 0.000321115610522015 8.73201469754458e-05 ... 309 | -0.000272813899063807 -0.000728040883331772 -0.00121232311086121 ... 310 | -0.00166745545718656 -0.002017236905325 -0.00221004575422702 ... 311 | -0.00219418161359554 -0.00195693426079309 -0.00149634900145798 ... 312 | -0.000853338810487761 -7.67217364537999e-05 0.000752988044242502 ... 313 | 0.0015636605122513 0.0022707550011296 0.0028145334147178 ... 314 | 0.00313705089397488 0.0032172861845596 0.00305067423893676 ... 315 | 0.0026744932687209 0.00212920622287149 0.00147102389173814 ... 316 | 0.000779724453430603 0.000117220153030299 -0.000463578741140334 ... 317 | -0.000910323983903008 -0.0012114325405598 -0.00135240424690182 ... 318 | -0.00135886579937377 -0.00124993663037054 -0.00107386143967476 ... 319 | -0.000862130982321538 -0.000662713612794409 -0.000496899333793406 ... 320 | -0.000394179580544488 -0.000353545485975799 -0.0003816461205007 ... 321 | -0.000458292846564782 -0.000577035216303767 -0.000712726807495988 ... 322 | -0.000862114418365961 -0.0010107443034646 -0.00117137124297013 ... 323 | -0.00134843843172702 -0.00157370713114779 -0.00186851816397141 ... 324 | 0.00441355600153117]); 325 | end 326 | 327 | y = step(Hd,double(x)); 328 | 329 | 330 | % [EOF] 331 | -------------------------------------------------------------------------------- /lowPassFilter12_5G.m: -------------------------------------------------------------------------------- 1 | function y = lowPassFilter12_5G(x) 2 | %LOWPASSFILTER12.5G Filters input x and returns output y. 3 | 4 | % MATLAB Code 5 | % Generated by MATLAB(R) 9.1 and the DSP System Toolbox 9.3. 6 | % Generated on: 31-Jul-2017 10:04:18 7 | 8 | %#codegen 9 | 10 | % To generate C/C++ code from this function use the codegen command. Type 11 | % 'help codegen' for more information. 12 | 13 | persistent Hd; 14 | 15 | if isempty(Hd) 16 | 17 | % The following code was used to design the filter coefficients: 18 | % % Equiripple Lowpass filter designed using the FIRPM function. 19 | % 20 | % % All frequency values are in GHz. 21 | % Fs = 600; % Sampling Frequency 22 | % 23 | % Fpass = 12; % Passband Frequency 24 | % Fstop = 13; % Stopband Frequency 25 | % Dpass = 0.057501127785; % Passband Ripple 26 | % Dstop = 0.0001; % Stopband Attenuation 27 | % dens = 20; % Density Factor 28 | % 29 | % % Calculate the order from the parameters using FIRPMORD. 30 | % [N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]); 31 | % 32 | % % Calculate the coefficients using the FIRPM function. 33 | % b = firpm(N, Fo, Ao, W, {dens}); 34 | 35 | Hd = dsp.FIRFilter( ... 36 | 'Numerator', [-5.19572218698301e-05 1.34038611768226e-06 ... 37 | 2.81523738737816e-06 5.31579525727656e-06 8.9138629886297e-06 ... 38 | 1.36794135953464e-05 1.97103819240733e-05 2.70949465889774e-05 ... 39 | 3.59423930858887e-05 4.63456055692649e-05 5.84130757711627e-05 ... 40 | 7.22310124049068e-05 8.78961038325515e-05 0.00010547713480743 ... 41 | 0.000125048889994921 0.00014665293289413 0.000170332959510812 ... 42 | 0.000196094799429417 0.000223943570171715 0.000253842494409611 ... 43 | 0.000285752229166741 0.000319588106919302 0.000355261944619782 ... 44 | 0.000392637145774321 0.000431573598550562 0.00047188011961623 ... 45 | 0.000513363536939753 0.0005557779606463 0.000598879464856339 ... 46 | 0.000642371247953436 0.000685965762993885 0.000729323438356526 ... 47 | 0.000772124119742056 0.000813995323682612 0.000854596548401516 ... 48 | 0.000893529906765678 0.000930446435723571 0.000964926426599415 ... 49 | 0.000996633345487884 0.00102511504815639 0.00105010558370016 ... 50 | 0.0010713103122837 0.0010882457574968 0.0011007556077096 ... 51 | 0.00110850847676388 0.00111131215669776 0.00110894428055443 ... 52 | 0.00110127530382728 0.00108817819006551 0.00106960677079027 ... 53 | 0.00104553515672961 0.00101601306392714 0.000981121149606578 ... 54 | 0.000941012019828548 0.000895875220133563 0.000845967742367757 ... 55 | 0.000791585456629679 0.000733085600974945 0.000670862651564817 ... 56 | 0.00060536436059475 0.000537071190150744 0.000466507067109947 ... 57 | 0.000394221726162343 0.000320796875896394 0.000246830944688066 ... 58 | 0.000172940982338169 9.97496065514023e-05 2.78829600389123e-05 ... 59 | -4.20397979173812e-05 -0.00010941167993467 -0.000173644840885704 ... 60 | -0.000234178689804558 -0.000290482540320047 -0.00034206740594284 ... 61 | -0.000388484128758465 -0.000429341131249532 -0.000464295336408892 ... 62 | -0.0004930780587625 -0.000515469873381645 -0.000531344820569635 ... 63 | -0.00054058187280248 -0.000543212846949596 -0.000539308468480038 ... 64 | -0.000528986466104155 -0.00051247787378204 -0.000490050784840261 ... 65 | -0.000462062108592606 -0.000428913093033008 -0.000391078466061257 ... 66 | -0.000349072183004486 -0.000303466890248213 -0.000254864666159425 ... 67 | -0.000203910280125493 -0.000151264630438307 -9.76139838132342e-05 ... 68 | -4.36453913673104e-05 9.94697483149325e-06 6.24845455250485e-05 ... 69 | 0.000113299654535076 0.000161756402291545 0.00020724690531752 ... 70 | 0.000249210223719421 0.000287129002080868 0.000320546384880998 ... 71 | 0.000349062433595572 0.000372348689959331 0.000390143632256209 ... 72 | 0.000402264399509377 0.000408600907775647 0.000409124972665848 ... 73 | 0.000403883174271972 0.000393003642165245 0.000376687754584053 ... 74 | 0.000355214189597979 0.000328928299947571 0.000298242895508664 ... 75 | 0.000263625793611567 0.000225598904548853 0.000184726685051944 ... 76 | 0.000141616348121392 9.69141589697051e-05 5.12497745222144e-05 ... 77 | 5.30468686107646e-06 -4.02601624119975e-05 -8.47883961257419e-05 ... 78 | -0.00012763873374701 -0.000168199100328444 -0.000205890419525542 ... 79 | -0.000240179560968683 -0.000270582186941604 -0.000296674474615475 ... 80 | -0.000318094634199893 -0.000334552579277489 -0.000345829763631515 ... 81 | -0.000351786734802099 -0.000352360761933688 -0.000347570915295025 ... 82 | -0.000337513548222503 -0.000322365029215065 -0.00030237499703014 ... 83 | -0.000277866862919915 -0.000249228938322751 -0.000216912792999846 ... 84 | -0.000181422328158226 -0.000143310309553605 -0.000103165778631477 ... 85 | -6.16095422210969e-05 -1.9280628412759e-05 2.31687042171052e-05 ... 86 | 6.50872730573676e-05 0.000105830052082688 0.000144773240092925 ... 87 | 0.00018131882171071 0.000214909344235956 0.000245030023098756 ... 88 | 0.000271222816355885 0.000293085464015788 0.000310286901425007 ... 89 | 0.00032256324243541 0.000329738090130761 0.000331702138166661 ... 90 | 0.000328424763782203 0.00031997386309946 0.000306478649342363 ... 91 | 0.000288159305156317 0.000265304564674719 0.000238278436744378 ... 92 | 0.000207506848272248 0.000173477501760616 0.000136727254485323 ... 93 | 9.78380694054457e-05 5.74244467055659e-05 1.61270611139669e-05 ... 94 | -2.54001101961476e-05 -6.64975099539612e-05 -0.000106512467166543 ... 95 | -0.000144807439922193 -0.000180771827281919 -0.000213829994933527 ... 96 | -0.000243451896955303 -0.000269160340480835 -0.000290539890874662 ... 97 | -0.000307242627843561 -0.000318994695729764 -0.000325599967279512 ... 98 | -0.000326943930573414 -0.000322995275075763 -0.000313807112085906 ... 99 | -0.000299516332476349 -0.000280341909592513 -0.000256581758887732 ... 100 | -0.000228607653076341 -0.000196859923788365 -0.00016183992790681 ... 101 | -0.000124103805554762 -8.42525542394846e-05 -4.29249675447658e-05 ... 102 | -7.83598297098641e-07 4.14924704685025e-05 8.32252009041176e-05 ... 103 | 0.000123730181695015 0.000162352031632747 0.000198461048246347 ... 104 | 0.00023145998396935 0.000260806690180982 0.000286010244614461 ... 105 | 0.000306648725018918 0.000322368709380987 0.000332897962991971 ... 106 | 0.000338044173217138 0.000337703877332944 0.000331859648626164 ... 107 | 0.000320585371492691 0.000304040978909932 0.000282474527719464 ... 108 | 0.00025621461041513 0.000225669328181151 0.000191316387539514 ... 109 | 0.00015369943721519 0.000113416044187154 7.11117094684296e-05 ... 110 | 2.74662041948123e-05 -1.68139821959792e-05 -6.10101674293425e-05 ... 111 | -0.000104399741808512 -0.000146270972269015 -0.000185931509900752 ... 112 | -0.000222722890308835 -0.000256028524253166 -0.000285287053854086 ... 113 | -0.000309998673847406 -0.000329736309174762 -0.000344149988342872 ... 114 | -0.000352976032304988 -0.000356039263181738 -0.000353259468985457 ... 115 | -0.00034465017181555 -0.000330320856486861 -0.000310472732546818 ... 116 | -0.00028540040736663 -0.000255489612974552 -0.000221197871479085 ... 117 | -0.000183065684675758 -0.00014169613890851 -9.77484412572984e-05 ... 118 | -5.1929603348675e-05 -4.98005404770985e-06 4.23352188953143e-05 ... 119 | 8.92420508598756e-05 0.000134966503110415 0.000178750814428949 ... 120 | 0.000219862765699773 0.000257610867785565 0.000291352759310135 ... 121 | 0.000320509240822504 0.000344570959763824 0.000363110398732904 ... 122 | 0.000375786290863729 0.000382353051955247 0.000382662194074704 ... 123 | 0.000376668616176807 0.000364428691717093 0.000346103301506391 ... 124 | 0.000321952641090483 0.000292336086576207 0.000257703625723179 ... 125 | 0.000218592544056325 0.000175615652471079 0.000129455167721524 ... 126 | 8.08483796984963e-05 3.05798022092458e-05 -2.05350037269221e-05 ... 127 | -7.1658758394305e-05 -0.000121950260668798 -0.000170574209329781 ... 128 | -0.000216719406328541 -0.000259606987691622 -0.000298508064406423 ... 129 | -0.00033275088921445 -0.000361741278354548 -0.000384963040808921 ... 130 | -0.000401990043041379 -0.000412500100630351 -0.000416271231780604 ... 131 | -0.000413193196962948 -0.000403267001583945 -0.000386606569709691 ... 132 | -0.000363437674656409 -0.000334094711901595 -0.000299016793190551 ... 133 | -0.000258740020512888 -0.000213890808492409 -0.000165174796767382 ... 134 | -0.000113367456871385 -5.93000854791467e-05 -3.84849109024771e-06 ... 135 | 5.20830862792165e-05 0.00010757466799453 0.000161707732838616 ... 136 | 0.000213578146875082 0.00026231338723812 0.000307084762382436 ... 137 | 0.000347123780231478 0.000381732886282919 0.000410300061350212 ... 138 | 0.000432307024761822 0.000447341116692759 0.000455100131275266 ... 139 | 0.000455400821037659 0.000448180087250646 0.000433500037388913 ... 140 | 0.000411544973075841 0.000382622312048009 0.000347155072673847 ... 141 | 0.00030567905833072 0.000258831542376333 0.00020734595008386 ... 142 | 0.000152036264898536 9.37878949809222e-05 3.3537114043589e-05 ... 143 | -2.7732560825328e-05 -8.90181958679189e-05 -0.00014930735071073 ... 144 | -0.000207594803536533 -0.000262901713557228 -0.000314290108619878 ... 145 | -0.000360879282156052 -0.000401860939556984 -0.000436512811741684 ... 146 | -0.00046421178024663 -0.000484444040607241 -0.000496815617094186 ... 147 | -0.00050105863406841 -0.000497038003673959 -0.000484753416427596 ... 148 | -0.000464341955177298 -0.000436075370443957 -0.000400358221724764 ... 149 | -0.000357720620808786 -0.000308812200545284 -0.000254390677347321 ... 150 | -0.000195312039860406 -0.000132515383171817 -6.70098690492153e-05 ... 151 | 1.43274235096845e-07 6.7845972089283e-05 0.000134983041264102 ... 152 | 0.000200438416477875 0.000263115548205217 0.000321953808369697 ... 153 | 0.000375948448173749 0.00042416556807712 0.000465760088307549 ... 154 | 0.00049998820454369 0.000526222651637252 0.000543962269239064 ... 155 | 0.00055284380765083 0.000552646314244579 0.000543297415899021 ... 156 | 0.000524874186207623 0.000497608811768414 0.000461875551435004 ... 157 | 0.000418196825224864 0.000367228299634747 0.000309752920478378 ... 158 | 0.000246667012678196 0.000178968304166312 0.000107738157314197 ... 159 | 3.41263945482344e-05 -4.06689297566887e-05 -0.000115419068914402 ... 160 | -0.000188886648080693 -0.000259844010769956 -0.000327095575611909 ... 161 | -0.000389496008476395 -0.000445971582952858 -0.000495536517177081 ... 162 | -0.000537311981228969 -0.000570539562041879 -0.000594596834432005 ... 163 | -0.000609006894692404 -0.000613449486569397 -0.000607765637625084 ... 164 | -0.000591963606684684 -0.000566218214665772 -0.000530871324756303 ... 165 | -0.000486425760473534 -0.000433540364320782 -0.000373018486994294 ... 166 | -0.000305797679862035 -0.000232933469118118 -0.00015558479823123 ... 167 | -7.4994105964262e-05 7.53071269968587e-06 9.06391705688521e-05 ... 168 | 0.000172958994763514 0.000253119940118739 0.000329774604087941 ... 169 | 0.000401621763416184 0.000467429500440367 0.000526055677646992 ... 170 | 0.0005764639343422 0.000617749489256125 0.00064914686059929 ... 171 | 0.000670050390820423 0.00068002099143637 0.000678798671285563 ... 172 | 0.000666304712924643 0.000642648121495205 0.000608122284557362 ... 173 | 0.000563204705430334 0.000508547782901073 0.000444972561149285 ... 174 | 0.000373453705133897 0.000295107456581943 0.000211171680114218 ... 175 | 0.000122989210329262 3.19838694974889e-05 -6.0359736254532e-05 ... 176 | -0.000152522916700037 -0.000242975185120155 -0.000330202053872687 ... 177 | -0.000412727678471911 -0.000489142148991744 -0.000558122924966374 ... 178 | -0.00061846001307776 -0.000669074667332111 -0.000709040872068855 ... 179 | -0.000737599572908366 -0.000754175014344826 -0.000758383658757816 ... 180 | -0.000750044628617027 -0.000729182435728388 -0.000696030585973835 ... 181 | -0.000651027290669989 -0.000594811875017825 -0.00052821459354021 ... 182 | -0.00045224663624965 -0.000368083031685663 -0.000277044477909038 ... 183 | -0.000180579283620346 -8.02388873505464e-05 2.23486869001028e-05 ... 184 | 0.000125500360203353 0.000227510899959192 0.000326676189963672 ... 185 | 0.000421325451682594 0.000509845419642772 0.000590711464603818 ... 186 | 0.000662509976355899 0.000723966226612784 0.000773963513884423 ... 187 | 0.000811566473738362 0.000836034894199402 0.00084684100664493 ... 188 | 0.000843677086127206 0.00082646577636674 0.000795360408037288 ... 189 | 0.000750747704343235 0.000693240455300421 0.000623672525245269 ... 190 | 0.000543084123449273 0.000452709549120435 0.000353955592516464 ... 191 | 0.000248382843546337 0.000137678274712988 2.36313615136803e-05 ... 192 | -9.18974903303656e-05 -0.000207004068869838 -0.000319774369772492 ... 193 | -0.000428313377392817 -0.000530779602323614 -0.00062541330981957 ... 194 | -0.000710569207960044 -0.000784741755755661 -0.000846594374216643 ... 195 | -0.000894980879503172 -0.000928968918303806 -0.000947853968229863 ... 196 | -0.000951176006335478 -0.000938729525099456 -0.000910567249911089 ... 197 | -0.000867003349248868 -0.000808611570642653 -0.000736215485883344 ... 198 | -0.000650880644880301 -0.000553896226310301 -0.000446758800828759 ... 199 | -0.000331146447725434 -0.000208896031982994 -8.19711543397962e-05 ... 200 | 4.75661317619191e-05 0.000177591539094586 0.000305949946270366 ... 201 | 0.000430493933909446 0.000549116393300451 0.000659788928185963 ... 202 | 0.000760593155202195 0.000849756651959092 0.000925680662455441 ... 203 | 0.00098697143514796 0.00103246232095335 0.00106123850484691 ... 204 | 0.00107265163231721 0.00106633635053693 0.00104221605621618 ... 205 | 0.0010005101887898 0.000941730568675509 0.000866679110735828 ... 206 | 0.00077643434829836 0.000672339519857557 0.000555979801156017 ... 207 | 0.000429161745601317 0.000293882582094692 0.00015230245976841 ... 208 | 6.7067368866796e-06 -0.000140527365095778 -0.000286972151316861 ... 209 | -0.000430185099778837 -0.000567754171835241 -0.00069733426256872 ... 210 | -0.000816687817030248 -0.000923723815897416 -0.00101653340546287 ... 211 | -0.00109342251926714 -0.00115294428017962 -0.00119392331652212 ... 212 | -0.00121548027057403 -0.00121704727213603 -0.00119838327590646 ... 213 | -0.00115957883880037 -0.00110106081297021 -0.00102358637233329 ... 214 | -0.000928236779818156 -0.000816400212923405 -0.000689754871356875 ... 215 | -0.000550241592559484 -0.000400037414245875 -0.000241519348918212 ... 216 | -7.72300990857559e-05 9.01650825052859e-05 0.000257918291619833 ... 217 | 0.000423246439134166 0.000583374035834391 0.000735582106358608 ... 218 | 0.000877250814589692 0.00100590691450996 0.0011192634321299 ... 219 | 0.00121526263643632 0.00129210963811224 0.00134830809267683 ... 220 | 0.00138268525937853 0.00139441829604486 0.00138304889136151 ... 221 | 0.00134849814378514 0.00129106870158352 0.00121144770899045 ... 222 | 0.00111069696002726 0.000990243089797812 0.00085185325215346 ... 223 | 0.000697615797503656 0.000529904856852791 0.000351346802227947 ... 224 | 0.00016477900326647 -2.67936920892313e-05 -0.000220248364801358 ... 225 | -0.000412392020190169 -0.000600015652549525 -0.000779945102296763 ... 226 | -0.000949096140514433 -0.00110452405472421 -0.00124347652013662 ... 227 | -0.00136343909807717 -0.00146218214306961 -0.00153779860513756 ... 228 | -0.00158874208472822 -0.00161385431976429 -0.00161239177336308 ... 229 | -0.00158404055793157 -0.00152892964661948 -0.00144763169447792 ... 230 | -0.0013411618652464 -0.00121096402917696 -0.00105889508037739 ... 231 | -0.000887196951862811 -0.00069846731691829 -0.000495618553785044 ... 232 | -0.000281836463992484 -6.05285456361549e-05 0.000164726535924571 ... 233 | 0.000390238484168242 0.000612261990375605 0.000827060711150883 ... 234 | 0.00103096622882118 0.00122044209000183 0.0013921409319895 ... 235 | 0.00154296554995982 0.00167012055255907 0.00177116493471846 ... 236 | 0.00184405382994249 0.00188718289228811 0.00189941480285934 ... 237 | 0.00188010953730534 0.00182913867959444 0.0017468968201886 ... 238 | 0.00163430028499002 0.00149278209318232 0.00132427304156622 ... 239 | 0.00113117947756873 0.000916348243518845 0.000683028753252264 ... 240 | 0.000434822701465364 0.000175632507137724 -9.04009251653945e-05 ... 241 | -0.000358960192563414 -0.000625622342356249 -0.000885927425068803 ... 242 | -0.00113545385362386 -0.00136988906923438 -0.00158510463097796 ... 243 | -0.00177722425055768 -0.00194269393291364 -0.00207834269022249 ... 244 | -0.00218144317453093 -0.00224976083239985 -0.00228160093146811 ... 245 | -0.00227584225543496 -0.0022319672395194 -0.00215007756044014 ... 246 | -0.00203090508390129 -0.00187580751945096 -0.00168675894561603 ... 247 | -0.00146632492333685 -0.00121763294964103 -0.000944328252329741 ... 248 | -0.000650525204617891 -0.00034074506905451 -1.9851735682655e-05 ... 249 | 0.000307023847712976 0.000634561268656068 0.00095733725930732 ... 250 | 0.00126990764758055 0.00156690148103265 0.00184310515262243 ... 251 | 0.00209355372362081 0.00231361353090497 0.00249906669997932 ... 252 | 0.00264618417776492 0.00275179850912908 0.00281336303798479 ... 253 | 0.00282900764956951 0.00279757890594412 0.00271867523948592 ... 254 | 0.00259266503313918 0.00242069819705153 0.00220469982299578 ... 255 | 0.0019473568410129 0.00165208663955606 0.00132299893254235 ... 256 | 0.000964840301729008 0.000582932937465767 0.000183097540181201 ... 257 | -0.000228427793585577 -0.000645082437695475 -0.00106007971798302 ... 258 | -0.00146651425929922 -0.00185746802752273 -0.00222612413674256 ... 259 | -0.00256587605317722 -0.00287044102062279 -0.00313396543165603 ... 260 | -0.00335113078906032 -0.00351724831910202 -0.00362835101226368 ... 261 | -0.00368127104622351 -0.00367371099458403 -0.00360429824495004 ... 262 | -0.00347263142090052 -0.00327930756543825 -0.00302593771468702 ... 263 | -0.00271514475574731 -0.00235054900030218 -0.00193673125986773 ... 264 | -0.00147918925386189 -0.000984269659432668 -0.000459093008850798 ... 265 | 8.85415156013556e-05 0.000650257576119264 0.00121722134023691 ... 266 | 0.00178026439882799 0.00233002091030359 0.00285706509068997 ... 267 | 0.00335205930766748 0.00380589834089027 0.00420985981803074 ... 268 | 0.00455574671556029 0.00483603162370966 0.00504398877244876 ... 269 | 0.00517382352284409 0.00522078550711761 0.00518127522304983 ... 270 | 0.00505293072553141 0.00483470435339005 0.00452691653769749 ... 271 | 0.00413129710303407 0.00365100168295665 0.00309061390203514 ... 272 | 0.00245612160432581 0.00175487834962275 0.000995539087901042 ... 273 | 0.000187981705353442 -0.000656795938487113 -0.00152679158068055 ... 274 | -0.0024091363152883 -0.00329024178408032 -0.00415596595286274 ... 275 | -0.00499178543926332 -0.00578298218579189 -0.00651483120079722 ... 276 | -0.00717279737880085 -0.00774273147932569 -0.00821106661838933 ... 277 | -0.00856500850686619 -0.00879272512359792 -0.00888351996391974 ... 278 | -0.00882800158320822 -0.00861823302609144 -0.00824787129346802 ... 279 | -0.00771228246550974 -0.0070086437464015 -0.00613601784839909 ... 280 | -0.00509541071957613 -0.0038897994165156 -0.00252414185000507 ... 281 | -0.00100535556347718 0.000657722248440393 0.00245440542760913 ... 282 | 0.00437224748485921 0.00639715940436183 0.00851354321984703 ... 283 | 0.0107044520198395 0.0129517624713176 0.015236369794296 ... 284 | 0.0175383908724138 0.0198373850916538 0.0221125781615705 ... 285 | 0.0243430980741913 0.026508208373605 0.0285875477219436 ... 286 | 0.0305613608363388 0.0324107297998899 0.0341177908493962 ... 287 | 0.035665945623702 0.0370400526032409 0.0382266082004765 ... 288 | 0.0392139029459464 0.0399921623517394 0.0405536597183684 ... 289 | 0.0408928110743683 0.0410062383023215 0.0408928110743683 ... 290 | 0.0405536597183684 0.0399921623517394 0.0392139029459464 ... 291 | 0.0382266082004765 0.0370400526032409 0.035665945623702 ... 292 | 0.0341177908493962 0.0324107297998899 0.0305613608363388 ... 293 | 0.0285875477219436 0.026508208373605 0.0243430980741913 ... 294 | 0.0221125781615705 0.0198373850916538 0.0175383908724138 ... 295 | 0.015236369794296 0.0129517624713176 0.0107044520198395 ... 296 | 0.00851354321984703 0.00639715940436183 0.00437224748485921 ... 297 | 0.00245440542760913 0.000657722248440393 -0.00100535556347718 ... 298 | -0.00252414185000507 -0.0038897994165156 -0.00509541071957613 ... 299 | -0.00613601784839909 -0.0070086437464015 -0.00771228246550974 ... 300 | -0.00824787129346802 -0.00861823302609144 -0.00882800158320822 ... 301 | -0.00888351996391974 -0.00879272512359792 -0.00856500850686619 ... 302 | -0.00821106661838933 -0.00774273147932569 -0.00717279737880085 ... 303 | -0.00651483120079722 -0.00578298218579189 -0.00499178543926332 ... 304 | -0.00415596595286274 -0.00329024178408032 -0.0024091363152883 ... 305 | -0.00152679158068055 -0.000656795938487113 0.000187981705353442 ... 306 | 0.000995539087901042 0.00175487834962275 0.00245612160432581 ... 307 | 0.00309061390203514 0.00365100168295665 0.00413129710303407 ... 308 | 0.00452691653769749 0.00483470435339005 0.00505293072553141 ... 309 | 0.00518127522304983 0.00522078550711761 0.00517382352284409 ... 310 | 0.00504398877244876 0.00483603162370966 0.00455574671556029 ... 311 | 0.00420985981803074 0.00380589834089027 0.00335205930766748 ... 312 | 0.00285706509068997 0.00233002091030359 0.00178026439882799 ... 313 | 0.00121722134023691 0.000650257576119264 8.85415156013556e-05 ... 314 | -0.000459093008850798 -0.000984269659432668 -0.00147918925386189 ... 315 | -0.00193673125986773 -0.00235054900030218 -0.00271514475574731 ... 316 | -0.00302593771468702 -0.00327930756543825 -0.00347263142090052 ... 317 | -0.00360429824495004 -0.00367371099458403 -0.00368127104622351 ... 318 | -0.00362835101226368 -0.00351724831910202 -0.00335113078906032 ... 319 | -0.00313396543165603 -0.00287044102062279 -0.00256587605317722 ... 320 | -0.00222612413674256 -0.00185746802752273 -0.00146651425929922 ... 321 | -0.00106007971798302 -0.000645082437695475 -0.000228427793585577 ... 322 | 0.000183097540181201 0.000582932937465767 0.000964840301729008 ... 323 | 0.00132299893254235 0.00165208663955606 0.0019473568410129 ... 324 | 0.00220469982299578 0.00242069819705153 0.00259266503313918 ... 325 | 0.00271867523948592 0.00279757890594412 0.00282900764956951 ... 326 | 0.00281336303798479 0.00275179850912908 0.00264618417776492 ... 327 | 0.00249906669997932 0.00231361353090497 0.00209355372362081 ... 328 | 0.00184310515262243 0.00156690148103265 0.00126990764758055 ... 329 | 0.00095733725930732 0.000634561268656068 0.000307023847712976 ... 330 | -1.9851735682655e-05 -0.00034074506905451 -0.000650525204617891 ... 331 | -0.000944328252329741 -0.00121763294964103 -0.00146632492333685 ... 332 | -0.00168675894561603 -0.00187580751945096 -0.00203090508390129 ... 333 | -0.00215007756044014 -0.0022319672395194 -0.00227584225543496 ... 334 | -0.00228160093146811 -0.00224976083239985 -0.00218144317453093 ... 335 | -0.00207834269022249 -0.00194269393291364 -0.00177722425055768 ... 336 | -0.00158510463097796 -0.00136988906923438 -0.00113545385362386 ... 337 | -0.000885927425068803 -0.000625622342356249 -0.000358960192563414 ... 338 | -9.04009251653945e-05 0.000175632507137724 0.000434822701465364 ... 339 | 0.000683028753252264 0.000916348243518845 0.00113117947756873 ... 340 | 0.00132427304156622 0.00149278209318232 0.00163430028499002 ... 341 | 0.0017468968201886 0.00182913867959444 0.00188010953730534 ... 342 | 0.00189941480285934 0.00188718289228811 0.00184405382994249 ... 343 | 0.00177116493471846 0.00167012055255907 0.00154296554995982 ... 344 | 0.0013921409319895 0.00122044209000183 0.00103096622882118 ... 345 | 0.000827060711150883 0.000612261990375605 0.000390238484168242 ... 346 | 0.000164726535924571 -6.05285456361549e-05 -0.000281836463992484 ... 347 | -0.000495618553785044 -0.00069846731691829 -0.000887196951862811 ... 348 | -0.00105889508037739 -0.00121096402917696 -0.0013411618652464 ... 349 | -0.00144763169447792 -0.00152892964661948 -0.00158404055793157 ... 350 | -0.00161239177336308 -0.00161385431976429 -0.00158874208472822 ... 351 | -0.00153779860513756 -0.00146218214306961 -0.00136343909807717 ... 352 | -0.00124347652013662 -0.00110452405472421 -0.000949096140514433 ... 353 | -0.000779945102296763 -0.000600015652549525 -0.000412392020190169 ... 354 | -0.000220248364801358 -2.67936920892313e-05 0.00016477900326647 ... 355 | 0.000351346802227947 0.000529904856852791 0.000697615797503656 ... 356 | 0.00085185325215346 0.000990243089797812 0.00111069696002726 ... 357 | 0.00121144770899045 0.00129106870158352 0.00134849814378514 ... 358 | 0.00138304889136151 0.00139441829604486 0.00138268525937853 ... 359 | 0.00134830809267683 0.00129210963811224 0.00121526263643632 ... 360 | 0.0011192634321299 0.00100590691450996 0.000877250814589692 ... 361 | 0.000735582106358608 0.000583374035834391 0.000423246439134166 ... 362 | 0.000257918291619833 9.01650825052859e-05 -7.72300990857559e-05 ... 363 | -0.000241519348918212 -0.000400037414245875 -0.000550241592559484 ... 364 | -0.000689754871356875 -0.000816400212923405 -0.000928236779818156 ... 365 | -0.00102358637233329 -0.00110106081297021 -0.00115957883880037 ... 366 | -0.00119838327590646 -0.00121704727213603 -0.00121548027057403 ... 367 | -0.00119392331652212 -0.00115294428017962 -0.00109342251926714 ... 368 | -0.00101653340546287 -0.000923723815897416 -0.000816687817030248 ... 369 | -0.00069733426256872 -0.000567754171835241 -0.000430185099778837 ... 370 | -0.000286972151316861 -0.000140527365095778 6.7067368866796e-06 ... 371 | 0.00015230245976841 0.000293882582094692 0.000429161745601317 ... 372 | 0.000555979801156017 0.000672339519857557 0.00077643434829836 ... 373 | 0.000866679110735828 0.000941730568675509 0.0010005101887898 ... 374 | 0.00104221605621618 0.00106633635053693 0.00107265163231721 ... 375 | 0.00106123850484691 0.00103246232095335 0.00098697143514796 ... 376 | 0.000925680662455441 0.000849756651959092 0.000760593155202195 ... 377 | 0.000659788928185963 0.000549116393300451 0.000430493933909446 ... 378 | 0.000305949946270366 0.000177591539094586 4.75661317619191e-05 ... 379 | -8.19711543397962e-05 -0.000208896031982994 -0.000331146447725434 ... 380 | -0.000446758800828759 -0.000553896226310301 -0.000650880644880301 ... 381 | -0.000736215485883344 -0.000808611570642653 -0.000867003349248868 ... 382 | -0.000910567249911089 -0.000938729525099456 -0.000951176006335478 ... 383 | -0.000947853968229863 -0.000928968918303806 -0.000894980879503172 ... 384 | -0.000846594374216643 -0.000784741755755661 -0.000710569207960044 ... 385 | -0.00062541330981957 -0.000530779602323614 -0.000428313377392817 ... 386 | -0.000319774369772492 -0.000207004068869838 -9.18974903303656e-05 ... 387 | 2.36313615136803e-05 0.000137678274712988 0.000248382843546337 ... 388 | 0.000353955592516464 0.000452709549120435 0.000543084123449273 ... 389 | 0.000623672525245269 0.000693240455300421 0.000750747704343235 ... 390 | 0.000795360408037288 0.00082646577636674 0.000843677086127206 ... 391 | 0.00084684100664493 0.000836034894199402 0.000811566473738362 ... 392 | 0.000773963513884423 0.000723966226612784 0.000662509976355899 ... 393 | 0.000590711464603818 0.000509845419642772 0.000421325451682594 ... 394 | 0.000326676189963672 0.000227510899959192 0.000125500360203353 ... 395 | 2.23486869001028e-05 -8.02388873505464e-05 -0.000180579283620346 ... 396 | -0.000277044477909038 -0.000368083031685663 -0.00045224663624965 ... 397 | -0.00052821459354021 -0.000594811875017825 -0.000651027290669989 ... 398 | -0.000696030585973835 -0.000729182435728388 -0.000750044628617027 ... 399 | -0.000758383658757816 -0.000754175014344826 -0.000737599572908366 ... 400 | -0.000709040872068855 -0.000669074667332111 -0.00061846001307776 ... 401 | -0.000558122924966374 -0.000489142148991744 -0.000412727678471911 ... 402 | -0.000330202053872687 -0.000242975185120155 -0.000152522916700037 ... 403 | -6.0359736254532e-05 3.19838694974889e-05 0.000122989210329262 ... 404 | 0.000211171680114218 0.000295107456581943 0.000373453705133897 ... 405 | 0.000444972561149285 0.000508547782901073 0.000563204705430334 ... 406 | 0.000608122284557362 0.000642648121495205 0.000666304712924643 ... 407 | 0.000678798671285563 0.00068002099143637 0.000670050390820423 ... 408 | 0.00064914686059929 0.000617749489256125 0.0005764639343422 ... 409 | 0.000526055677646992 0.000467429500440367 0.000401621763416184 ... 410 | 0.000329774604087941 0.000253119940118739 0.000172958994763514 ... 411 | 9.06391705688521e-05 7.53071269968587e-06 -7.4994105964262e-05 ... 412 | -0.00015558479823123 -0.000232933469118118 -0.000305797679862035 ... 413 | -0.000373018486994294 -0.000433540364320782 -0.000486425760473534 ... 414 | -0.000530871324756303 -0.000566218214665772 -0.000591963606684684 ... 415 | -0.000607765637625084 -0.000613449486569397 -0.000609006894692404 ... 416 | -0.000594596834432005 -0.000570539562041879 -0.000537311981228969 ... 417 | -0.000495536517177081 -0.000445971582952858 -0.000389496008476395 ... 418 | -0.000327095575611909 -0.000259844010769956 -0.000188886648080693 ... 419 | -0.000115419068914402 -4.06689297566887e-05 3.41263945482344e-05 ... 420 | 0.000107738157314197 0.000178968304166312 0.000246667012678196 ... 421 | 0.000309752920478378 0.000367228299634747 0.000418196825224864 ... 422 | 0.000461875551435004 0.000497608811768414 0.000524874186207623 ... 423 | 0.000543297415899021 0.000552646314244579 0.00055284380765083 ... 424 | 0.000543962269239064 0.000526222651637252 0.00049998820454369 ... 425 | 0.000465760088307549 0.00042416556807712 0.000375948448173749 ... 426 | 0.000321953808369697 0.000263115548205217 0.000200438416477875 ... 427 | 0.000134983041264102 6.7845972089283e-05 1.43274235096845e-07 ... 428 | -6.70098690492153e-05 -0.000132515383171817 -0.000195312039860406 ... 429 | -0.000254390677347321 -0.000308812200545284 -0.000357720620808786 ... 430 | -0.000400358221724764 -0.000436075370443957 -0.000464341955177298 ... 431 | -0.000484753416427596 -0.000497038003673959 -0.00050105863406841 ... 432 | -0.000496815617094186 -0.000484444040607241 -0.00046421178024663 ... 433 | -0.000436512811741684 -0.000401860939556984 -0.000360879282156052 ... 434 | -0.000314290108619878 -0.000262901713557228 -0.000207594803536533 ... 435 | -0.00014930735071073 -8.90181958679189e-05 -2.7732560825328e-05 ... 436 | 3.3537114043589e-05 9.37878949809222e-05 0.000152036264898536 ... 437 | 0.00020734595008386 0.000258831542376333 0.00030567905833072 ... 438 | 0.000347155072673847 0.000382622312048009 0.000411544973075841 ... 439 | 0.000433500037388913 0.000448180087250646 0.000455400821037659 ... 440 | 0.000455100131275266 0.000447341116692759 0.000432307024761822 ... 441 | 0.000410300061350212 0.000381732886282919 0.000347123780231478 ... 442 | 0.000307084762382436 0.00026231338723812 0.000213578146875082 ... 443 | 0.000161707732838616 0.00010757466799453 5.20830862792165e-05 ... 444 | -3.84849109024771e-06 -5.93000854791467e-05 -0.000113367456871385 ... 445 | -0.000165174796767382 -0.000213890808492409 -0.000258740020512888 ... 446 | -0.000299016793190551 -0.000334094711901595 -0.000363437674656409 ... 447 | -0.000386606569709691 -0.000403267001583945 -0.000413193196962948 ... 448 | -0.000416271231780604 -0.000412500100630351 -0.000401990043041379 ... 449 | -0.000384963040808921 -0.000361741278354548 -0.00033275088921445 ... 450 | -0.000298508064406423 -0.000259606987691622 -0.000216719406328541 ... 451 | -0.000170574209329781 -0.000121950260668798 -7.1658758394305e-05 ... 452 | -2.05350037269221e-05 3.05798022092458e-05 8.08483796984963e-05 ... 453 | 0.000129455167721524 0.000175615652471079 0.000218592544056325 ... 454 | 0.000257703625723179 0.000292336086576207 0.000321952641090483 ... 455 | 0.000346103301506391 0.000364428691717093 0.000376668616176807 ... 456 | 0.000382662194074704 0.000382353051955247 0.000375786290863729 ... 457 | 0.000363110398732904 0.000344570959763824 0.000320509240822504 ... 458 | 0.000291352759310135 0.000257610867785565 0.000219862765699773 ... 459 | 0.000178750814428949 0.000134966503110415 8.92420508598756e-05 ... 460 | 4.23352188953143e-05 -4.98005404770985e-06 -5.1929603348675e-05 ... 461 | -9.77484412572984e-05 -0.00014169613890851 -0.000183065684675758 ... 462 | -0.000221197871479085 -0.000255489612974552 -0.00028540040736663 ... 463 | -0.000310472732546818 -0.000330320856486861 -0.00034465017181555 ... 464 | -0.000353259468985457 -0.000356039263181738 -0.000352976032304988 ... 465 | -0.000344149988342872 -0.000329736309174762 -0.000309998673847406 ... 466 | -0.000285287053854086 -0.000256028524253166 -0.000222722890308835 ... 467 | -0.000185931509900752 -0.000146270972269015 -0.000104399741808512 ... 468 | -6.10101674293425e-05 -1.68139821959792e-05 2.74662041948123e-05 ... 469 | 7.11117094684296e-05 0.000113416044187154 0.00015369943721519 ... 470 | 0.000191316387539514 0.000225669328181151 0.00025621461041513 ... 471 | 0.000282474527719464 0.000304040978909932 0.000320585371492691 ... 472 | 0.000331859648626164 0.000337703877332944 0.000338044173217138 ... 473 | 0.000332897962991971 0.000322368709380987 0.000306648725018918 ... 474 | 0.000286010244614461 0.000260806690180982 0.00023145998396935 ... 475 | 0.000198461048246347 0.000162352031632747 0.000123730181695015 ... 476 | 8.32252009041176e-05 4.14924704685025e-05 -7.83598297098641e-07 ... 477 | -4.29249675447658e-05 -8.42525542394846e-05 -0.000124103805554762 ... 478 | -0.00016183992790681 -0.000196859923788365 -0.000228607653076341 ... 479 | -0.000256581758887732 -0.000280341909592513 -0.000299516332476349 ... 480 | -0.000313807112085906 -0.000322995275075763 -0.000326943930573414 ... 481 | -0.000325599967279512 -0.000318994695729764 -0.000307242627843561 ... 482 | -0.000290539890874662 -0.000269160340480835 -0.000243451896955303 ... 483 | -0.000213829994933527 -0.000180771827281919 -0.000144807439922193 ... 484 | -0.000106512467166543 -6.64975099539612e-05 -2.54001101961476e-05 ... 485 | 1.61270611139669e-05 5.74244467055659e-05 9.78380694054457e-05 ... 486 | 0.000136727254485323 0.000173477501760616 0.000207506848272248 ... 487 | 0.000238278436744378 0.000265304564674719 0.000288159305156317 ... 488 | 0.000306478649342363 0.00031997386309946 0.000328424763782203 ... 489 | 0.000331702138166661 0.000329738090130761 0.00032256324243541 ... 490 | 0.000310286901425007 0.000293085464015788 0.000271222816355885 ... 491 | 0.000245030023098756 0.000214909344235956 0.00018131882171071 ... 492 | 0.000144773240092925 0.000105830052082688 6.50872730573676e-05 ... 493 | 2.31687042171052e-05 -1.9280628412759e-05 -6.16095422210969e-05 ... 494 | -0.000103165778631477 -0.000143310309553605 -0.000181422328158226 ... 495 | -0.000216912792999846 -0.000249228938322751 -0.000277866862919915 ... 496 | -0.00030237499703014 -0.000322365029215065 -0.000337513548222503 ... 497 | -0.000347570915295025 -0.000352360761933688 -0.000351786734802099 ... 498 | -0.000345829763631515 -0.000334552579277489 -0.000318094634199893 ... 499 | -0.000296674474615475 -0.000270582186941604 -0.000240179560968683 ... 500 | -0.000205890419525542 -0.000168199100328444 -0.00012763873374701 ... 501 | -8.47883961257419e-05 -4.02601624119975e-05 5.30468686107646e-06 ... 502 | 5.12497745222144e-05 9.69141589697051e-05 0.000141616348121392 ... 503 | 0.000184726685051944 0.000225598904548853 0.000263625793611567 ... 504 | 0.000298242895508664 0.000328928299947571 0.000355214189597979 ... 505 | 0.000376687754584053 0.000393003642165245 0.000403883174271972 ... 506 | 0.000409124972665848 0.000408600907775647 0.000402264399509377 ... 507 | 0.000390143632256209 0.000372348689959331 0.000349062433595572 ... 508 | 0.000320546384880998 0.000287129002080868 0.000249210223719421 ... 509 | 0.00020724690531752 0.000161756402291545 0.000113299654535076 ... 510 | 6.24845455250485e-05 9.94697483149325e-06 -4.36453913673104e-05 ... 511 | -9.76139838132342e-05 -0.000151264630438307 -0.000203910280125493 ... 512 | -0.000254864666159425 -0.000303466890248213 -0.000349072183004486 ... 513 | -0.000391078466061257 -0.000428913093033008 -0.000462062108592606 ... 514 | -0.000490050784840261 -0.00051247787378204 -0.000528986466104155 ... 515 | -0.000539308468480038 -0.000543212846949596 -0.00054058187280248 ... 516 | -0.000531344820569635 -0.000515469873381645 -0.0004930780587625 ... 517 | -0.000464295336408892 -0.000429341131249532 -0.000388484128758465 ... 518 | -0.00034206740594284 -0.000290482540320047 -0.000234178689804558 ... 519 | -0.000173644840885704 -0.00010941167993467 -4.20397979173812e-05 ... 520 | 2.78829600389123e-05 9.97496065514023e-05 0.000172940982338169 ... 521 | 0.000246830944688066 0.000320796875896394 0.000394221726162343 ... 522 | 0.000466507067109947 0.000537071190150744 0.00060536436059475 ... 523 | 0.000670862651564817 0.000733085600974945 0.000791585456629679 ... 524 | 0.000845967742367757 0.000895875220133563 0.000941012019828548 ... 525 | 0.000981121149606578 0.00101601306392714 0.00104553515672961 ... 526 | 0.00106960677079027 0.00108817819006551 0.00110127530382728 ... 527 | 0.00110894428055443 0.00111131215669776 0.00110850847676388 ... 528 | 0.0011007556077096 0.0010882457574968 0.0010713103122837 ... 529 | 0.00105010558370016 0.00102511504815639 0.000996633345487884 ... 530 | 0.000964926426599415 0.000930446435723571 0.000893529906765678 ... 531 | 0.000854596548401516 0.000813995323682612 0.000772124119742056 ... 532 | 0.000729323438356526 0.000685965762993885 0.000642371247953436 ... 533 | 0.000598879464856339 0.0005557779606463 0.000513363536939753 ... 534 | 0.00047188011961623 0.000431573598550562 0.000392637145774321 ... 535 | 0.000355261944619782 0.000319588106919302 0.000285752229166741 ... 536 | 0.000253842494409611 0.000223943570171715 0.000196094799429417 ... 537 | 0.000170332959510812 0.00014665293289413 0.000125048889994921 ... 538 | 0.00010547713480743 8.78961038325515e-05 7.22310124049068e-05 ... 539 | 5.84130757711627e-05 4.63456055692649e-05 3.59423930858887e-05 ... 540 | 2.70949465889774e-05 1.97103819240733e-05 1.36794135953464e-05 ... 541 | 8.9138629886297e-06 5.31579525727656e-06 2.81523738737816e-06 ... 542 | 1.34038611768226e-06 -5.19572218698301e-05]); 543 | end 544 | 545 | y = step(Hd,double(x)); 546 | 547 | 548 | % [EOF] 549 | --------------------------------------------------------------------------------