Result Convolution/ multiplication in freq domain not the same

Hi, I got a channel and I want to do a convolution with my Signal. I got a Test with multiplication in frequency domain - works fine. In time domain with convolution it doesn't work. My Signal is in real longer so i cant always use multiplication.
maybe you know the problem so I get the same signal with multiplication and convolution?
thank you!!
here i got my code:
I've seen that the fft result differs between row and column vector. Now I corrected to only row vectors, but no correct result... looks like impulse response wrong...
H_f = [0.0094 - 0.0373i, 0.0122 - 0.0326i, 0.0143 - 0.0279i, 0.0157 - 0.0247i];% channel spectrum
nSubcarriers = 4;
N = 64; % FFT
H_ifft = [0, H_f, zeros(1,N-2*length(H_f)-1), conj(H_f(end:-1:1))];
h_t = ifft(H_ifft, N); % impulse respone of channel
kk = 1e3;
data = (randn(1, 4*(kk+1)) >= 0);
iq_data_conv = [];
iq_data_freq = [];
for ii = 1:kk
Signal = 2*data(ii*4:(ii)*4+3) - 1;
TxSpectrum = [0, Signal, zeros(1,N-2*length(Signal)), conj(Signal(end:-1:1))];
ofdm_signal_t = ifft(TxSpectrum, N); % IFFT
%%%%%%%%%%%%%%%%%%%%%WITH CONVOLUTION
channel_signal_conv = conv(ofdm_signal_t, h_t);% CONV
channel_signal_conv = channel_signal_conv(1:length(ofdm_signal_t)); % cut
% ... noise ect
R_f = fft(channel_signal_conv, N); % FFT
s_rec = R_f(2:nSubcarriers+1);%Extracting the data carriers from the FFT output
iq_data_conv = [iq_data_conv s_rec];
%%%%%%%%%%%%%%%%%%%%%Multiplication in frequency domain
tmp = fft(ofdm_signal_t, N); % FFT
tmp = tmp(2:nSubcarriers+1);
tmpH = tmp.*H_f;
tmpC = [0, tmpH, 0, conj(tmpH(end:-1:1))];
channel_signal_freq = ifft(tmpC, N); % IFFT
% ... noise ect
R_f = fft(channel_signal_freq, N); % FFT
s_rec = R_f(2:nSubcarriers+1);%Extracting the data carriers from the FFT output
iq_data_freq = [iq_data_freq s_rec];
%%%%%%%%%%%%%%%%%%%%%
end
scatterplot(iq_data_conv);
scatterplot(iq_data_freq);

 Accepted Answer

Hi I've got the problem. I forgot the cyclic prefix so i get ICI
best regards

More Answers (1)

Without going into your code too much, since you are dealing with discrete Fourier transforms, you have to keep in mind that you must pad the data vectors in time before taking the DFT in order to demonstrate agreement with linear convolution.
For example, I'll filter a white noise input with a moving average filter.
h = 1/3*ones(3,1);
x = randn(16,1);
N = 16+3-1; %the minimum pad factor
h1 = [h; zeros(N-length(h),1)];
x1 = [x ; zeros(N-length(x),1)];
out = ifft(fft(x1).*fft(h1));
yconv = conv(x,h);
Compare out and yconv.

1 Comment

multiplication in frequency domain works correct.
convolution doesn't give the correct result...
thx

Sign in to comment.

Asked:

on 14 Mar 2012

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!