OFDMguiFnSound.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:11k
- function OFDMguiFnSound(action)
% Consolidates all of the GUI callbacks into one main function
% Alan Brooks the man wrote this
stringArray = [...
% Slide 1
'Welcome to the Sound OFDM demo. This simulates QAM '...
'and OFDM using a sound file as input to demonstrate '...
'the advantages of using OFDM with a multipath '...
'channel. '...
'Choose the strength of multipath present in the '...
'channel and the plot will show the current channels '...
'frequency response. ';...
% Slide 2
'Here is a frequency domain (FD) representation of the '...
'QAM data to be transmitted. '...
'Press any key to continue. '...
' '...
' '...
' '...
' ';...
% Slide 2b
'For QAM (single-carrier) transmission, this plot '...
'shows the channel frequency response (black) and the '...
'received data (light blue) overlayed on the original '...
'data (blue). Note that the received data is slightly '...
'distorted due to the fading channel caused by '...
'multipath. '...
'Press any key to continue. ';...
% Slide 2c
'Here is a frequency domain (FD) representation of the '...
'OFDM data to be transmitted. '...
'Press any key to continue. '...
' '...
' '...
' '...
' ';...
% Slide 2d
'For OFDM (multi-carrier) transmission, this plot '...
'shows the channel (black) and received data (light '...
'blue) overlayed on the original data (blue). Note '...
'that the OFDM received data also exhibits multipath '...
'distortion. Also, notice that the OFDM signal is '...
'spread out over more bandwidth than QAM since OFDM '...
'uses many carrier frequencies. ';...
% Slide 3
'Here are the final plots of the recovered sound files '...
'along with the Bit Error Rate (BER) for OFDM and QAM. '...
'Click any of the 3 buttons to hear these sounds. '...
'Since OFDM handles multipath better, the sound is '...
'less distorted. '...
'The Long Sounds demonstrate longer examples that have '...
'already been processed offline. '];
switch(action)
case 'next' %---------------------------------------
textHnd1=findobj('Tag','StaticTextFeedback');
nextHnd1=findobj('Tag','PushbuttonNext'); % handler for the Next button
% axis handlers
axisHnd1=findobj('Tag','Axes1'); % main
axisHnd2=findobj('Tag','AxesOriginal'); % original
axisHnd3=findobj('Tag','AxesQAM'); % QAM
axisHnd4=findobj('Tag','AxesOFDM'); % OFDM
% multipath handlers
textHnd2=findobj('Tag','StaticTextMultipath');
popupHnd1=findobj('Tag','PopupMenuMultipath');
% Generated Sounds handlers
textHnd3=findobj('Tag','StaticTextGenSounds');
OriginalHnd1=findobj('Tag','PushbuttonOriginal');
QAMHnd1=findobj('Tag','PushbuttonQAM');
OFDMHnd1=findobj('Tag','PushbuttonOFDM');
% Long Sounds handlers
textHnd4=findobj('Tag','StaticTextLongSounds');
OriginalLongHnd1=findobj('Tag','PushbuttonOriginalLong');
QAMLongHnd1=findobj('Tag','PushbuttonQAMLong');
OFDMLongHnd1=findobj('Tag','PushbuttonOFDMLong');
% BER handlers
textHnd5=findobj('Tag','StaticTextBER1'); % label
textHnd6=findobj('Tag','StaticTextBER2'); % label
textHnd7=findobj('Tag','StaticTextBERQAM'); % OFDM BER field
textHnd8=findobj('Tag','StaticTextBEROFDM'); % QAM BER field
global COUNTER
if isempty(COUNTER)
COUNTER = 0; % initialize COUNTER if doesn't exist
end
COUNTER = COUNTER + 1;
[r c]=size(stringArray);
if COUNTER > r
COUNTER = 0;
close(gcf)
- % SoundGUI
SoundGUI_win % windows only
else
set(textHnd1,'String',stringArray(COUNTER,:))
switch(COUNTER)
case 1
% disp('Slide 1')
% Show/Hide the GUI
set(nextHnd1,'String','Next')
% show multipath controls
set(textHnd2,'Visible','on')
set(popupHnd1,'Visible','on')
% enable multipath controls
set(textHnd2,'Enable','on')
set(popupHnd1,'Enable','on')
% show main axis
set(axisHnd1,'Visible','on'),axes(axisHnd1)
% hide other axis's
set(axisHnd2,'Visible','off')
set(axisHnd3,'Visible','off')
set(axisHnd4,'Visible','off')
% hide generated sounds stuff
set(textHnd3,'Visible','off')
set(OriginalHnd1,'Visible','off')
set(QAMHnd1,'Visible','off')
set(OFDMHnd1,'Visible','off')
% hide long sounds stuff
set(textHnd4,'Visible','off')
set(OriginalLongHnd1,'Visible','off')
set(QAMLongHnd1,'Visible','off')
set(OFDMLongHnd1,'Visible','off')
% hide the BER displays
set(textHnd5,'Visible','off')
set(textHnd6,'Visible','off')
set(textHnd7,'Visible','off')
set(textHnd8,'Visible','off')
set(popupHnd1,'Value',1) % no channel by default
% default plot
plot(0:.05:.5,zeros(1,11)),axis([0 0.5 -12 6]),title('Channel Magnitude Response')
xlabel('Digital Frequency'),ylabel('Magnitude (dB)')
case {2, 3, 4, 5}
% disp('Slide 2')
% disble multipath controls
set(textHnd2,'Enable','off')
set(popupHnd1,'Enable','off')
setupSoundGUI % sets up the Sound GUI variables
set(textHnd1,'String','QAM Simulation... Please Wait')
QAM
set(textHnd1,'String',stringArray(COUNTER,:))
fft_temp = abs(fft(QAM_tx_data));
fft_temp = fft_temp(1:floor(0.5*length(fft_temp))); % truncate (+ spectrum)
dig_x_axis = (1:length(fft_temp)) / (2*length(fft_temp));
plot(dig_x_axis, fft_temp)
title('FFT of Transmitted QAM')
% calculate the BER and store for slide 6
global BER_QAM_TEMP;
binary_err_bits_QAM = 0;
for i = 1:length(data_in)
err = abs(data_in(i)-QAM_data_out(i));
if err > 0
binary_err_bits_QAM = binary_err_bits_QAM + 1;
end
end
BER_QAM_TEMP = 100 * binary_err_bits_QAM/data_length;
COUNTER = COUNTER + 1;
pause
% disp('Slide 2b')
set(textHnd1,'String',stringArray(COUNTER,:))
hold on
% QAM Plotting
fft_temp = abs(fft(QAM_rx_data));
fft_temp = fft_temp(1:floor(0.5*length(fft_temp))); % truncate
plot(dig_x_axis, fft_temp,'c'),title(' ')
% channel display
if channel_on == 1
ComputeChannelGUI
size_mag=max(mag)-min(mag); % for scaled channel plot
plot(W/(2*pi),(0.5*max(fft_temp)/size_mag)*(mag + abs(min(mag))) + 0.5*max(fft_temp),'k')
end
hold off
COUNTER = COUNTER + 1;
pause
% disp('Slide 2c')
set(textHnd1,'String','OFDM Simulation... Please Wait')
OFDM
set(textHnd1,'String',stringArray(COUNTER,:))
fft_temp = abs(fft(xmit));
fft_temp = fft_temp(1:floor(0.5*length(fft_temp))); % truncate
dig_x_axis = (1:length(fft_temp)) / (2*length(fft_temp));
plot(dig_x_axis, fft_temp)
title('FFT of Transmitted OFDM')
% calculate the BER and store for slide 6
global BER_OFDM_TEMP;
binary_err_bits_OFDM = 0;
for i = 1:length(data_in)
err = abs(data_in(i)-output(i));
if err > 0
binary_err_bits_OFDM = binary_err_bits_OFDM +1;
end
end
BER_OFDM_TEMP = 100 * binary_err_bits_OFDM/data_length;
COUNTER = COUNTER + 1;
pause
% disp('Slide 2d')
set(textHnd1,'String',stringArray(COUNTER,:))
hold on
% OFDM Plotting
fft_temp = abs(fft(recv));
fft_temp = fft_temp(1:floor(0.5*length(fft_temp))); % truncate
plot(dig_x_axis, fft_temp,'c'),title(' ')
% channel display
if channel_on == 1
plot(W/(2*pi),(0.5*max(fft_temp)/size_mag)*(mag + abs(min(mag))) + 0.5*max(fft_temp),'k')
end
hold off
case 6
% disp('Slide 3')
setupSoundGUI
% hide main axis
plot(0) % clear the plot
axis off
% set(axisHnd1,'Visible','off')
% show other axis's
set(axisHnd2,'Visible','on')
set(axisHnd3,'Visible','on')
set(axisHnd4,'Visible','on')
% hide multipath controls
set(textHnd2,'Visible','off')
set(popupHnd1,'Visible','off')
% show generated sound buttons
set(textHnd3,'Visible','on')
set(OriginalHnd1,'Visible','on')
set(QAMHnd1,'Visible','on')
set(OFDMHnd1,'Visible','on')
% show long sounds stuff
set(textHnd4,'Visible','on')
set(OriginalLongHnd1,'Visible','on')
set(QAMLongHnd1,'Visible','on')
set(OFDMLongHnd1,'Visible','on')
% show the BER displays
set(textHnd5,'Visible','on')
set(textHnd6,'Visible','on')
set(textHnd7,'Visible','on') % QAM
set(textHnd8,'Visible','on') % OFDM
% Display the BERs
global BER_QAM_TEMP;
global BER_OFDM_TEMP;
set(textHnd7,'String',strcat(num2str(BER_QAM_TEMP,3),' %'))
set(textHnd8,'String',strcat(num2str(BER_OFDM_TEMP,3),' %'))
clear global BER_QAM_TEMP; % clean up the globals
clear global BER_OFDM_TEMP;
% Plot the Sounds
% Note: axes(handle) sets to plot on the handle axis
axes(axisHnd2)
plot(wavread(file_name)),title('Original sound')
axes(axisHnd3)
plot(wavread('QAM_out.wav')),title('QAM sound')
axes(axisHnd4)
plot(wavread('OFDM_out.wav')),title('OFDM sound')
set(nextHnd1,'String','Start Over') % repeat if desired
otherwise
disp('error')
COUNTER = 0;
end
end
case 'mp_channel' %-----------------------------------
ComputeChannelGUI
if noChannel ~= 1
% large or small case
plot(W/(2*pi),mag),axis([0 0.5 -12 6]),title('Channel Magnitude Response')
xlabel('Digital Frequency'),ylabel('Magnitude (dB)')
else
% none case
plot(0:.05:.5,zeros(1,11)),axis([0 0.5 -12 6]),title('Channel Magnitude Response')
xlabel('Digital Frequency'),ylabel('Magnitude (dB)')
end
case 'close' %---------------------------------------
clear global COUNTER
close(gcbf)
case 'PlayOriginal' %-----------------------------------
sound(wavread('shortest.wav'),11025)
case 'PlayQAM' %---------------------------------------
sound(wavread('QAM_out.wav'),11025)
case 'PlayOFDM' %---------------------------------------
sound(wavread('OFDM_out.wav'),11025)
case 'PlayOriginalLong' %-----------------------------------
sound(wavread('Long.wav'),11025)
case 'PlayQAMLong' %---------------------------------------
sound(wavread('QAM_Long.wav'),11025)
case 'PlayOFDMLong' %---------------------------------------
sound(wavread('OFDM_Long.wav'),11025)
case 'figure' %---------------------------------------
% this is called whenever the figure is first created -or NOT???
% textHnd1=findobj('Tag','StaticTextFeedback');
% axisHnd1=findobj('Tag','Axes1');
% set(textHnd1,'String','Sound OFDM Demo') % default text message
% set(axisHnd1,'Visible','off') % hide Axis to begin
end