OFDM Simulation in MATLAB

Поділитися
Вставка
  • Опубліковано 27 кві 2015
  • EEL6509 Wireless Communications
    University of Florida
    Electrical and Computer Engineering
  • Комедії

КОМЕНТАРІ • 210

  • @tayyabakhtar6157
    @tayyabakhtar6157 6 років тому +21

    here is the code !! :) enjoy
    clear all
    close all
    clc
    %% simulation parameters
    %modulation method: BPSK, QPSK, SPSK, 16QAM, 32QAM, 64QAM
    mod_method = 'QPSK';
    % IFFT/FFT size
    n_fft = 64;
    %size of cyclic prefix extension
    n_cpe = 16;
    %target SNR (dB)
    snr = 20;
    %number of channel taps (1 == no channel)
    n_taps = 8;
    %channel estimation method: none, LS
    ch_est_method = 'LS';
    %option to save plot to file
    save_file = 0;
    %calculate modulation order from modulation method
    mod_methods = {'BPSK', 'QPSK', '8PSK', '16QAM', '32QAM', '64QAM'};
    mod_order = find (ismember (mod_methods, mod_method));
    %% input data do binary stream
    im = imread('baboon.bmp');
    im_bin = dec2bin(im(:))';
    im_bin = im_bin(:);
    %% binary stream to symbols
    %parse binary stream into mod_order bit symbols
    %pads input signal to appropriate length
    sym_rem = mod( mod_order-mod( length( im_bin), mod_order), mod_order);
    padding = repmat ( '0', sym_rem, 1);
    im_bin_padded = [im_bin; padding];
    cons_data = reshape( im_bin_padded, mod_order, length(im_bin_padded)/mod_order)';
    cons_sym_id = bin2dec(cons_data);
    %% symbol modulation
    %BPSK
    if mod_order == 1
    mod_ind = 2^(mod_order-1);
    n = 0:pi/mod_ind:2*pi-pi/mod_ind;
    in_phase = cos(n);
    quadrature = sin(n);
    symbol_book = (in_phase + quadrature*1i)';
    end
    %phase shift keying about unit circle
    if mod_order == 2 || mod_order == 3
    mod_ind = 2^(mod_order-1);
    n = 0: pi/mod_ind: 2*pi-pi/mod_ind;
    in_phase = cos(n+pi/4);
    quadrature = sin(n+pi/4);
    symbol_book = (in_phase + quadrature*1i)';
    end
    %16QAM, 64QAM modulation
    if mod_order == 4 || mod_order == 64
    mod_ind = sqrt(2^mod_order);
    in_phase = repmat(linspace(-1, 1, mod_ind), mod_ind, 1);
    quadrature = repmat(linspace(-1, 1, mod_ind)', 1, mod_ind);
    symbol_book = in_phase(:) + quadrature(:)*1i;
    end
    %32QAM modulation
    %generates 6x6 constellation and removes corners
    if mod_order == 5
    mod_ind = 6;
    in_phase = repmat(linspace(-1, 1, mod_ind), mod_ind, 1);
    quadrature = repmat(linspace(-1, 1, mod_ind)', 1, mod_ind);
    symbol_book = in_phase(:) + quadrature(:)*1i;
    symbol_book = symbol_book([2:5 7:30 32:35]);
    end
    %modulate data according to symbol_book
    X = symbol_book(cons_sym_id+1);
    %% use IFFT to move to time domain
    %pad input signal to appropriate length
    fft_rem = mod(n_fft-mod(length(X), n_fft), n_fft);
    X_padded = [X; zeros(fft_rem,1)];
    X_blocks = reshape(X_padded, n_fft, length(X_padded)/n_fft);
    x = ifft(X_blocks);
    %add cyclic prefix extension and shift from parallel to serial
    x_cpe = [x(end-n_cpe+1:end,:);x];
    x_s = x_cpe(:);
    %add AWGN
    %calculate data power
    data_pwr = mean(abs(x_s.^2));
    %add noise to channel
    noise_pwr = data_pwr/10^(snr/10);
    noise = normrnd(0,sqrt(noise_pwr/2),size(x_s)) + normrnd(0, sqrt(noise_pwr/2), size(x_s))*1i;
    x_s_noise = x_s + noise;
    %measure SNR
    snr_meas = 10*log10(mean(abs(x_s.^2))/mean(abs(noise.^2)));
    %% apply fading channel
    g = exp(-(0:n_taps-1));
    g = g/norm(g);
    x_s_noise_fading = conv(x_s_noise, g, 'same');
    %% use fft to move to frequency domain
    %remove cyclic prefix extension and shift from serial to parallel
    x_p = reshape(x_s_noise_fading, n_fft+n_cpe, length(x_s_noise_fading)/(n_fft+n_cpe));
    x_p_cpr = x_p(n_cpe + 1:end,:);
    %move to frequency domain
    X_hat_blocks = fft(x_p_cpr);
    %% estimate channel
    if n_taps > 1
    switch(ch_est_method)
    case 'none'
    case 'LS'
    G = X_hat_blocks(:,1)./X_blocks(:,1);
    X_hat_blocks = X_hat_blocks./repmat(G,1,size(X_hat_blocks,2));
    end
    end
    %% symbol demodulation
    %remove fft padding
    X_hat = X_hat_blocks(:);
    X_hat = X_hat(1:end-fft_rem);
    %recover data from modulated symbols
    rec_syms = knnsearch([real(symbol_book) imag(symbol_book)], [real(X_hat) imag(X_hat)]) - 1;
    %parse to binary stream & remove symbol padding
    rec_syms_cons = dec2bin(rec_syms);
    rec_im_bin = reshape(rec_syms_cons', numel(rec_syms_cons),1);
    rec_im_bin = rec_im_bin(1:end-sym_rem);
    ber = sum(abs(rec_im_bin - im_bin))/length(im_bin);
    %% recover image
    rec_im = reshape(rec_im_bin,8, numel(rec_im_bin)/8);
    rec_im = uint8(bin2dec(rec_im'));
    rec_im = reshape(rec_im,size(im));
    %% generate plots
    %transmit constellation
    subplot(2,2,1);
    plot(X, 'x', 'linewidth', 2, 'markersize', 10);
    xlim([-2 2]);
    ylim([-2 2]);
    xlabel('In Phase');
    ylabel('Quadrature');
    if n_taps > 1
    title(sprintf('Poslani konstelacijski dijagram
    \
    m%s Modulacija
    Multipath Channel Taps: %d', mod_method, n_taps));
    else
    title(sprintf('Poslani konstelacijski dijagram
    \
    m%s Modulacija', mod_method));
    end
    grid on;
    %recovered constellation
    subplot(2,2,2);
    plot(X_hat(1:500:end),'x','markersize',3);
    xlim([-2 2]);
    ylim([-2 2]);
    xlabel('In Phase');
    ylabel('Quadrature');
    if n_taps > 1
    title(sprintf('Primljeni konstelacijski dijagram
    \
    mMeasured SNR: %.2f db
    Channel Estimation: %s', snr_meas, ch_est_method));
    else
    title(sprintf('bfPrimljeni konstelacijski dijagram
    \
    mMeasured SNR: %.2f dB', snr_meas));
    end
    grid on;
    %original image
    subplot(2,2,3);
    imshow(im);
    title('\bfPoslana slika');
    %recovered image
    subplot(2,2,4);
    imshow(rec_im);
    title(sprintf('\\bfOporavljena slika
    \
    mBER: %.2g', ber));
    %position figure
    %set(gcf,'Position',[680 287 698 691]);
    %save figure
    if save_file
    print(sprintf('Plots/%s_%.0ffft_%.0fcpe_%0fdB_%.0ftaps_%s',mod_method, n_fft, n_cpe, snr, n_taps, ch_est_method), '-dmeta');
    end

  • @BoutinMathieu
    @BoutinMathieu Рік тому

    Very very nice job! You talk clearly and you kept things easy to understand.

  • @southpark4151
    @southpark4151 3 роки тому +1

    Nice video! Can I ask what method was used to remove the cyclic prefix at the receiver side? At the receiver side ----- not on the transmitter side. Thanks!

  • @alvaromartelo3885
    @alvaromartelo3885 4 роки тому +2

    Hi Jordan. I watched your video about implementing OFDM in Matlab. However I'm getting some errors in the reshaping of the image, I'm getting BERs of 30% and 50% from the same parameters you use in your video, could you help me out? I don't know why the code is failing

  • @gbtjom
    @gbtjom 8 років тому +1

    Great presentation. Is the code available somewhere? thx.

  • @chrish9506
    @chrish9506 4 роки тому

    Great video!

  • @m.o.e6210
    @m.o.e6210 4 роки тому

    hey jordan. i'm facing issue with knnsearch function at symbol demodulation section Error says:"Error using imag Not enough input arugment". Have any idea how I can fix that.

  • @murodkurbanov2901
    @murodkurbanov2901 8 років тому +3

    perfect. could you you help me with the that code please?

  • @Joey5537
    @Joey5537 5 років тому +1

    Category is Comedy? It's a tad dry standup performance for my taste, but I learned a lot!

  • @arjunmenonkandanat6328
    @arjunmenonkandanat6328 4 роки тому +3

    Line 146 you need to write rec_im = uint8(bin2dec(num2str(rec_im')));
    Otherwise error will come

  • @hughvera3569
    @hughvera3569 11 місяців тому

    can be used this script in digital fm IBOC? with WB=200 khz and df=19 KHZ

  • @dafragar
    @dafragar 8 років тому

    Hi Jordan,Is it possible to get the code?

  • @srikanth43354
    @srikanth43354 9 днів тому

    am trying to do this on same boaed in gnu radio any help is appreciated

  • @noknackman
    @noknackman 5 років тому +2

    I have got an error in reshape function, plz can you help(line 40)

  • @poornimaa351
    @poornimaa351 2 роки тому

    Hello Jordan could you please share the code???
    It will be really helpful, I ran this code but I am getting the BER=0.22, don't know why? whereas you showed in the video BER=.098. could you please help me? thanks

  • @yarondorman
    @yarondorman 4 роки тому +1

    Great presentation! Looking at the matlab code, Why is the AWGN added before the channel convolution? In a typical model, the signal should 1st pass through a channel and only then an AWGN is added.

    • @franciscogerardohernandezr4788
      @franciscogerardohernandezr4788 3 роки тому

      I noticed the same issue, so I compared the code to the Yong Soo OFDM book samples and indeed, it is flipped.

  • @ISDANA1
    @ISDANA1 8 років тому

    Congratulation Jordan.I loved your exploration. Can you help me I have some doubts?

    • @ISDANA1
      @ISDANA1 8 років тому

      +Claudia Toledo (ctoledonunes@hotmail.com)

    • @ISDANA1
      @ISDANA1 8 років тому

      Please help me if you can with the questions below, if its not possible,
      can you indicate who /where could help me?
      About OFDM ( to LTE 4 G)
      1- bandwidth allocated to each carrier and carrier amount allocated to each user ;2- number of subcarriers per carrier and quantity of points of IFFT / FFT multiplexing ;3 subcarriers to the reference ( synchronization , AGC , equalizing , etc. );4 subcarriers unsigned (to avoid interference between adjacent carriers ) ;5- sampling frequency of the modulated carrier ;6- type convolutional code (FEC );7-kinds modulation ( BPSK , QPSK , QAM) ;8- scrambling ;9- equalization algorithm ;10- estimation algorithm for signal demodulation ;
      (ctoledonunes@hotmail.com)

    • @hamidhamidbenyahia6347
      @hamidhamidbenyahia6347 4 роки тому

      can you plese send me your code , fyi my email (hamid20101995@gmail.com) and thank you

  • @LIJINGVARGHESEBEC
    @LIJINGVARGHESEBEC 6 років тому +2

    Nice work actually I'm working on a project where I have to design OFDM based Tx and Rx could you please send me the code it would be very helpful in my project

  • @kingleynut6539
    @kingleynut6539 3 роки тому

    Does someone have the same simulation code for Fbmc help urgent for assignment 🙏🙏

  • @safsf.a9211
    @safsf.a9211 3 роки тому

    Please i want to lecture , i need it because the Graduation project

  • @touchmycunt2874
    @touchmycunt2874 3 роки тому

    Bro if u still get notifications . It would be of great help if you could provide me with the code

  • @rafaliu011
    @rafaliu011 3 роки тому

    Great!!!

  • @tayyabakhtar6157
    @tayyabakhtar6157 6 років тому

    Your tutorial is very helpful. can u please send me the matlab code ?

  • @laizadelara1122
    @laizadelara1122 4 роки тому +1

    Alguem conseguiu o codigo?

  • @yuvistorm
    @yuvistorm Рік тому

    I'm working on a project where I have to design Analysis of SNR Metrics for a Typical
    Underwater Acoustic OFDM System. Could you please send me the code it would be very helpful in my project

  • @hluizmelo
    @hluizmelo 8 років тому +1

    Hello, congratulations, nice video.
    After constellation mapper, the phasors into the IFFT block, but the IFFT is a sum. How can the output be parallel?

    • @hluizmelo
      @hluizmelo 8 років тому

      +Jordan Street
      image.slidesharecdn.com/thamkhaoofdm-tutorial-150608094800-lva1-app6891/95/tham-khao-ofdm-tutorial-7-638.jpg?cb=1433756946

  • @mohamedhtful
    @mohamedhtful 8 місяців тому

    THANKS VERY NICE I want PDF FILE

  • @maryemsabor7141
    @maryemsabor7141 7 років тому

    please could you send me the MATLAB code :)and Thank you

  • @omardjemili7152
    @omardjemili7152 7 років тому

    Since the code is available elsewhere, Why didn't you accept to send it ! what's the problem in sharing the code with others ?

    • @JordanStreet
      @JordanStreet  7 років тому +4

      om ar then go get the code from elsewhere :)

    • @omardjemili7152
      @omardjemili7152 7 років тому

      i said that because you said "I will not give it since there is a plenty of examples existing"

  • @gopirajdokku3570
    @gopirajdokku3570 4 роки тому +3

    link for the code
    kr.mathworks.com/matlabcentral/fileexchange/67156-ofdm-channel-estimation-in-matlab

  • @potobill
    @potobill 8 років тому +1

    Good job. Is the code online?

  • @hungthe5658
    @hungthe5658 7 років тому

    Hi Jordan Street, Thank you for your sharing! Your lecture is very helpful for my project. Would you mind sharing your matlab code with me!
    Thanks!

    • @hungthe5658
      @hungthe5658 7 років тому

      my email is: hungnt515@gmail.com

  • @b3vuu9t22
    @b3vuu9t22 5 років тому +2

    Hello, could you send me this code ? Appreciate !!

  • @joshuaabolade4155
    @joshuaabolade4155 8 років тому

    Please i am doing something on vlc and I want to use ofdm .....please can you send me the code ....and any additional information. .Thanks

    • @joshuaabolade4155
      @joshuaabolade4155 8 років тому

      email is josh.abolade@gmail.com

    • @smaouiachraf8533
      @smaouiachraf8533 7 років тому

      Hi Joshua Abolade, please can you send me the matlab code? email is smaouiachraf290@gmail.com. thank you

  • @moussacissoko59
    @moussacissoko59 5 років тому

    your video is very interesting can you share with me your Matlab code

  • @tuntunlinn57
    @tuntunlinn57 6 років тому

    your video is very helpful I am interesting could you send me the MATLAB code please

  • @youeng1
    @youeng1 7 років тому +4

    Your tutorial is very helpful. I am interesting could you send me the MATLAB code please

    • @youeng1
      @youeng1 7 років тому

      youeng75@gmail.com

    • @bouchrasaim1376
      @bouchrasaim1376 7 років тому

      me too i'm interesting would you send me the MATLAB code please it's very important for my thesis please : saimbouchra@gmail.com

    • @terziuvasi8424
      @terziuvasi8424 7 років тому

      Hello. You receive the matlab code from Jordan? Thanks

    • @ActioNizza
      @ActioNizza 7 років тому

      can you plese send me your code, or give me yuor mail

    • @youeng1
      @youeng1 6 років тому

      Hi everyone, I didn't receive the code yet.

  • @LoveYourLife2704
    @LoveYourLife2704 4 роки тому

    cons_sym_id does not work

  • @julioernestocardenaslopez8296
    @julioernestocardenaslopez8296 8 років тому

    Very good! Is it possible to get the code???

  • @lisabraun3899
    @lisabraun3899 5 років тому

    Hi can you send me this matlab code? Thanks :)

    • @JordanStreet
      @JordanStreet  5 років тому

      Elizabeth Butler Sure thing! Thanks for asking, it’s on it’s way!

    • @jayantbenjamin4307
      @jayantbenjamin4307 4 роки тому

      Did you get the code? can you send it to me as well? jayant.b@somaiya.edu

    • @dharunsangrithiyayan6773
      @dharunsangrithiyayan6773 4 роки тому

      @@JordanStreet jordan please provide us.code

    • @omerjawaid77
      @omerjawaid77 4 роки тому

      hey please can you giive the code?

  • @MAWARIR
    @MAWARIR 8 років тому +2

    How come he did not use any of the pilot schemes in this project.

    • @whateeverelse
      @whateeverelse 5 років тому

      He does! But only one pilot in the frequency domain for the first OFDM symbol block, see line 125. He assumes the first n_fft symbols of the image are known to the receiver.

  • @engkareemhamed
    @engkareemhamed 5 років тому

    please i study PHD in Cairo and need help from you in matlab my paper can send to me your email please to send to you my problems

  • @tayyabakhtar6157
    @tayyabakhtar6157 6 років тому

    code dede yar bhai hoga :p

  • @ShubhamBhargava11
    @ShubhamBhargava11 6 років тому +2

    I have the code...incase anyone is interested.

  • @manasgarai6260
    @manasgarai6260 7 років тому

    Your tutorial is very helpful. can u please send me the matlab code ?