📄 dsimsoft_export.m
字号:
param.fade.DelayVec, param.fade.GainVec);
Data.yFading = filter(chan, Data.yNoise);
handles.str = [handles.str; {'->> Adding Rayleigh Fading... Done!'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
PlotListStr = {...
'Source Signal'; ...
'In-Phase (Mod baseband)'; ...
'Quadrature-Phase (baseband)'; ...
'I/Q Phase (Mod)'; ...
'In-Phase (After TxRRC)'; ...
'Quadrature-Phase (after TxRRC)'; ...
'I/Q Phase (Tx Filterd)'; ...
'I-Phase (AWGN)'; ...
'Quadrature-Phase (AWGN)'; ...
'I/Q Phase (AWGN)'; ...
'In-Phase (Rayleigh Fade)'; ...
'Quadrature-Phase (Rayleigh Fade)'; ...
'I/Q Phase (Rayleigh Fade)'};
ScatterListStr = {...
'Modulated SIG (Tx)'; ...
'After RRC Filter (Tx)'; ...
'Gauss White Noise (Tx)'; ...
'After Rayleigh Fading (Tx)'};
else
Data.yFading = handles.data.yFading;
end
if isempty(PlotListStr)
PlotListStr = {...
'In-Phase (Rayleigh Fade)'; ...
'Quadrature-Phase (Rayleigh Fade)'; ...
'I/Q Phase (Rayleigh Fade)'};
end
if isempty(ScatterListStr)
ScatterListStr = {...
'After Rayleigh Fading (Tx)'};
end
if (get(handles.radiobtn_Sim, 'value') && ...
get(handles.chkb_Sim_Rx, 'value')) || ...
(get(handles.radiobtn_Test, 'value') && ...
get(handles.chkb_Test_Rx, 'value'))
set(handles.output, 'Pointer', 'watch');
handles.str = [handles.str; {'->> Filtering Received Data...'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
% filter designed
Data.rrcfltcoef = rcosine(param.mod.Fd*param.mod.nSamp, ...
param.mod.Fd*param.mod.nSamp*param.rrc.OverSamp, 'fir/sqrt', ...
param.rrc.RollOff, param.rrc.Delay);
% received filter
yRx = filter(Data.rrcfltcoef, 1, Data.yFading);
% down sample
yDown = downsample(yRx,param.rrc.OverSamp);
% conpensated
Data.yDown = yDown(param.rrc.Order/param.rrc.OverSamp+1:end);
handles.str = [handles.str; {'->> Filtering Received Data... Done!'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
handles.str = [handles.str; {'->> Starting Demodulation...'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
% demodulation, using cp4fsk demod function
Data.z =cpfskdemod_new(Data.yDown, 4, param.mod.Index, ...
param.mod.nSamp, param.mod.Fd);
Data.z = 2*(Data.z+1)-5;
handles.str = [handles.str; {'->> Starting Demodulation... Done'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
PlotListStr = [PlotListStr; ...
{'In-Phase (After RxRRC)'}; ...
{'Quadrature-Phase (After RxRRC)'}; ...
{'I/Q Phase (After RxRRC)'}; ...
{'Demodulated Signal'}];
ScatterListStr = [ScatterListStr; ...
{'Received filter (Rx)'}];
end
% starting plot.
handles.str = [handles.str; {'->> Starting plot...'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
% only Transmitter, or both Transmitter and Receiver for Simulation.
if (get(handles.radiobtn_Sim, 'value') && ...
get(handles.chkb_Sim_Tx, 'value')) || ...
(get(handles.radiobtn_Test, 'value') && ...
get(handles.chkb_Test_Tx, 'value'))
t = [0:param.src.BitNum/2-1]'/param.mod.Fd;
maxLen = length(t);
axes(handles.axes_main);
stem(t, Data.x, 'r.');
strTitle = handles.AxesTitle_Plot_SourceSig;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
SetAxes(handles, strTitle, strxLabel, stryLabel);
axis([0 max(t) -6 6]);
end
% only Receiver
if (get(handles.radiobtn_Sim, 'value') && ...
~get(handles.chkb_Sim_Tx, 'value') && ...
get(handles.chkb_Sim_Rx, 'value')) || ...
(get(handles.radiobtn_Test, 'value') && ...
get(handles.chkb_Test_Rx, 'value'))
t = [0:length(Data.yFading)-1]'/...
(param.mod.Fd*param.mod.nSamp*param.rrc.OverSamp);
maxLen = length(t);
axes(handles.axes_main);
plot(t, real(Data.yFading), 'r-');
strTitle = handles.AxesTitle_Plot_ITxSigFade;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
SetAxes(handles, strTitle, strxLabel, stryLabel);
end
SetSlider(handles, maxLen);
handles.str = [handles.str; {'->> Starting plot... Done!'}];
set(handles.edt_Process, 'string', handles.str);
pause(0.01);
handles.data = Data;
guidata(handles.output, handles);
%assignin('base', 'data', Data);
set(handles.list_Variable, 'string', PlotListStr, ...
'value', 1);
set(handles.popup_Scatter, 'string', ScatterListStr, ...
'value', 1);
% if used for simulation
if get(handles.radiobtn_Sim, 'value')
set([handles.btn_TxDataExport, handles.btn_TxDataSave, ...
handles.btn_RxDataImport, handles.btn_RxDataSave], ...
'enable', 'off');
end
% if used for TEST DSP/FPGA,
if get(handles.radiobtn_Test, 'value')
% if only transmitter
if get(handles.chkb_Test_Tx, 'value') && ...
~get(handles.chkb_Test_Rx, 'value')
set([handles.btn_TxDataExport, handles.btn_TxDataSave], ...
'enable', 'on');
set([handles.btn_RxDataImport, handles.btn_RxDataSave], ...
'enable', 'off');
else
% only Receiver
if ~get(handles.chkb_Test_Tx, 'value') && ...
get(handles.chkb_Test_Rx, 'value')
set([handles.btn_TxDataExport, handles.btn_TxDataSave, ...
handles.btn_RxDataImport], 'enable', 'off');
set(handles.btn_RxDataSave, 'enable', 'on');
end
end
end
%set(handles.btn_APPLY, 'enable', 'off');
set(handles.btn_Plot, 'enable', 'on');
set(handles.btn_ScatterPlot, 'enable', 'on');
set(handles.output, 'Pointer', 'arrow');
% --- Executes on button press in btn_Exit.
function btn_Exit_Callback(hObject, eventdata, handles)
my_closereq(handles);
% --- Executes on button press in btn_Help.
function btn_Help_Callback(hObject, eventdata, handles)
open('UserGuide.pdf');
% ===================================================================
% --- Executes on slider movement.
% -------------------------------------------------------------------
function slider_AxesAdjust_From_Callback(hObject, eventdata, handles)
ToVal = fix(get(handles.slider_AxesAdjust_To, 'value'));
FromVal = fix(get(handles.slider_AxesAdjust_From, 'value'));
if FromVal < ToVal
set(handles.txt_AxisFrom, 'string', num2str(FromVal));
else
msgbox('''From'' value must less than ''To'' value', ...
'ERROR', 'ERROR', 'modal');
set(handles.txt_AxisFrom, 'string', num2str(ToVal));
set(handles.slider_AxesAdjust_From, 'value', ToVal);
FromVal = ToVal - 1;
end
AdjustAxis(handles, FromVal, ToVal);
function slider_AxesAdjust_From_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), ...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% ===================================================================
% --- Executes on slider movement.
% -------------------------------------------------------------------
function slider_AxesAdjust_To_Callback(hObject, eventdata, handles)
ToVal = fix(get(handles.slider_AxesAdjust_To, 'value'));
FromVal = fix(get(handles.slider_AxesAdjust_From, 'value'));
if FromVal < ToVal
set(handles.txt_AxisTo, 'string', num2str(ToVal));
else
ToVal = FromVal + 1;
msgbox('''From'' value must less than ''To'' value', ...
'ERROR', 'ERROR', 'modal');
set(handles.txt_AxisTo, 'string', num2str(ToVal));
set(handles.slider_AxesAdjust_To, 'value', ToVal);
end
AdjustAxis(handles, FromVal, ToVal);
% --- Executes during object creation, after setting all properties.
function slider_AxesAdjust_To_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), ...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% =================================================================
% --- Executes on selection change in list_Variable.
% -----------------------------------------------------------------
function list_Variable_Callback(hObject, eventdata, handles)
if strcmp(get(handles.list_Variable, 'string'), '<empty>'),
return
else
val = get(handles.list_Variable, 'value');
if (get(handles.radiobtn_Sim, 'value') && ...
~get(handles.chkb_Sim_Tx, 'value') && ...
get(handles.chkb_Sim_Rx, 'value')) || ...
(get(handles.radiobtn_Test, 'value') && ...
get(handles.chkb_Test_Rx, 'value'))
val = val + 10;
end
switch val
case {4,7,10,13,16}
set([handles.btn_Plot3, handles.btn_Polar], 'enable', 'on');
otherwise
set([handles.btn_Plot3, handles.btn_Polar], 'enable', 'off');
end
end
function list_Variable_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), ...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% =================================================================
% --- Executes on button press in btn_Plot.
% -----------------------------------------------------------------
function btn_Plot_Callback(hObject, eventdata, handles)
set(handles.output, 'Pointer', 'watch');
src = getappdata(handles.output, 'src');
mod = getappdata(handles.output, 'mod');
rrc = getappdata(handles.output, 'rrc');
data = handles.data;
val = get(handles.list_Variable, 'value');
axes(handles.axes_main);
if (get(handles.radiobtn_Sim, 'value') && ...
~get(handles.chkb_Sim_Tx, 'value') && ...
get(handles.chkb_Sim_Rx, 'value')) || ...
(get(handles.radiobtn_Test, 'value') && ...
get(handles.chkb_Test_Rx, 'value'))
val = val + 10;
end
switch val
case 1,
t = [0:src.BitNum/2-1]'/mod.Fd;
stem(t, data.x, 'r.');
strTitle = handles.AxesTitle_Plot_SourceSig;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
axis([0 max(t) -6 6]);
maxLen = length(t);
case 2,
t = [0:length(data.y)-1]'/(mod.Fd*mod.nSamp);
plot(t, real(data.y), 'b-');
strTitle = handles.AxesTitle_Plot_ITxSigMod;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
axis([0, max(t), -1.5 1.5])
maxLen = length(t);
case 3,
t = [0:length(data.y)-1]'/(mod.Fd*mod.nSamp);
plot(t, imag(data.y), 'r-');
strTitle = handles.AxesTitle_Plot_QTxSigMod;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
axis([0, max(t), -1.5 1.5])
maxLen = length(t);
case 4,
t = [0:length(data.y)-1]'/(mod.Fd*mod.nSamp);
plot(t, unwrap(angle(data.y)), 'c-');
strTitle = handles.AxesTitle_Plot_IQTxPhaseMod;
strxLabel = 'Time (s)';
stryLabel = 'Phase (radian)';
%axis square;
%axis([-1.2 1.2 -1.2 1.2])
maxLen = length(data.y);
case 5,
t = [0:length(data.yTx)-1]'/(mod.Fd*mod.nSamp*rrc.OverSamp);
plot(t, real(data.yTx), 'b-');
strTitle = handles.AxesTitle_Plot_ITxSigFilter;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
axis([0, max(t), -0.6 0.6])
maxLen = length(t);
case 6,
t = [0:length(data.yTx)-1]'/(mod.Fd*mod.nSamp*rrc.OverSamp);
plot(t, imag(data.yTx), 'r-');
strTitle = handles.AxesTitle_Plot_QTxSigFilter;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
axis([0, max(t), -0.6 0.6])
maxLen = length(t);
case 7,
t = [0:length(data.yTx)-1]'/(mod.Fd*mod.nSamp*rrc.OverSamp);
plot(t, unwrap(angle(data.yTx)), 'm-');
strTitle = handles.AxesTitle_Plot_IQTxPhaseFilter;
strxLabel = 'Time (s)';
stryLabel = 'Phase (radian)';
%axis square;
%axis([-1.2 1.2 -1.2 1.2])
maxLen = length(data.yTx);
case 8,
t = [0:length(data.yNoise)-1]'/(mod.Fd*mod.nSamp*rrc.OverSamp);
plot(t, real(data.yNoise), 'b-');
strTitle = handles.AxesTitle_Plot_QTxSigNoise;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
%axis([0, max(t), -0.6 0.6])
maxLen = length(t);
case 9,
t = [0:length(data.yNoise)-1]'/(mod.Fd*mod.nSamp*rrc.OverSamp);
plot(t, imag(data.yNoise), 'r-');
strTitle = handles.AxesTitle_Plot_QTxSigNoise;
strxLabel = 'Time (s)';
stryLabel = 'Amplitude';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -