On the signal recovery in OFDM after estimation
There is a mistake int the conv function which you are using in your code. In ofdm, the channel must be convoluted with every symbol. 
the link provided in the above comments are ok, but you need to modify them according to your parameters.  so replace the command of y = conv(x_ifft_p2s,h,'same'); by below command: 

for jj = 1 : n_ofdm_sym
         y(jj,:) = conv(h(jj,:),x_cp(jj,:));       
end


then add the noise into y.   

NP: be careful if the n_ofdm_sym  is more than one, you need to build your channel $h$ as a matrix of size $nofdmsym$ x $nsubc$ .  

Good luck