How I can perform SIMO channel convolution in MATLAB

In OFDM system, I need to transmit a signal $x$ in SIMO channel $H$ of single Tx antenna and $4$ Rx antennas. The initial equation for that convolution is $r = Hx + n$ where $n$ is the noise.

As known, in OFDM, after serial/Parallel conversion with dimension $(Number of subcarriers, Number of symbols)$, we perform the $IFFT$ and then add Cyclic prefix. Than, P/S conversion in order to do convolution between signal and channel. In case if we are using SISO system, we perform in $MATLAB$ the command $conv(H,x)$, regardless the dimensions in length of channel and transmitted signal, but the problem I'm facing now, what's about if we are using SIMO channel? the convolution operation should be replaced by product since we have matrices, as mentioned, $r = Hx$

Below is the code, the issue is in the last line, how can I get the received signal $r$ in case if $H$ and $x$ don't have similar dimensions to do the matrices product operation?

clear all;
clc;

N = 128;       %Number of subcarriers
P = 32;        % CP length
Q = N + P;    % subcarriers + CP
AA = 1000;     %number of symbole
M = 15;        % IR order
p = 4;         % # of Rx antennas

sn=sign(randn(N,AA))+1i*sign(randn(N,AA));     %generate a signal ()
xn=ifft(sn);   %    FFT
cp(1:P,1:AA)=xn(N-P+1:N,1:AA);                  % Get CP
H = (randn(p,M+1)+1i*randn(p,M+1));            % randum channle (4x16)
r = H*x;                                       %% The received signal should be conv(H,x)

• r = zeros(p,length(x)+M); for i = 1:p r(i,:) = conv(H(i,:),x); end – AlexTP Sep 14 '18 at 18:56
• OK, thank you very much .. that's ok too.. what I understand is that you did convolution with four channels one by one. that's a great it. But, why didn't you used the idea of multiplication? – Fatima_Ali Sep 15 '18 at 9:09
• You can use matrix multiplication if they represent frequency domain information, because circular convolution in time domain is equivalent to multiplication in frequency domain. – AlexTP Sep 15 '18 at 11:37
• Got it, but can we represent the channel like that also? . hm=zeros(plength(x), length(x)+M); for m=1:length(x) hm((m-1)*p+1:pm,m:m+M)=H(:,1:M+1); end Then we do convolution hm with signal x . . . is that right too? – Fatima_Ali Sep 17 '18 at 4:04
• As Dan Boschen said, it seems that you are creating Toeplitz matrix. His answer is a good one, we can follow the discussion of his answer. – AlexTP Sep 17 '18 at 7:46

Your question is specific to how to do the convolution with a matrix multiplication in the case of a SIMO system.

Below is a graphic from Compensating Loudspeaker frequency response in an audio signal showing how the Toeplitz matrix is used to do SISO convolution with matrix multiplication:

In your case "r" in the graphic is "x" in your code, and the Toeplitz Matrix A is formed by placing x in the column and shifting this along the diagonal over the number of columns given by your channel length (in your case 12). So if your transmit signal was 160 samples long and your channel 16 long, A would be a 175 x 16 matrix. As shown in the figure above, if you only had a single channel, the channel would be multiplied as a column vector resulting in the matrix product of 175x16 with 16x1 resulting in a solution as a column vector of 175 x 1. (Remember to do the matrix multiplication, the inside dimensions must match and the result will be the outside dimensions).

For multiple channels as your case, simply multiply by the 16x4 channel matrix instead. This will result in 175x16 mulitplied with 16x4 resulting in a matrix result of 175 x 4, representing a column for each received signal.

• You are creating the Toeplitz matrix I assume? I haven't debugged your code, but have you tried it and compared? – Dan Boschen Sep 17 '18 at 4:51
• Alex was referring to another method, which is if two vectors you are multiplying are in one domain (frequency or time), the result would be the same as convolution (circular convolution specifically) in the other domain. Did you get an out of memory error using the toeplitz command directly (as I show in the small blue window in the figure)? – Dan Boschen Sep 17 '18 at 12:28
• Don’t try to model the passband (ever!). This is a prime reason not to; what occurs there is identical to the baseband analytic signal- there is NO need to model every cycle of the carrier. I have another post about this that I will look for later. – Dan Boschen Sep 17 '18 at 14:38
• But basically model the complex (real and imaginary) baseband signal and then your required sample rate depends on your signal bandwidth only and has nothing to do with the carrier frequency used. – Dan Boschen Sep 17 '18 at 14:39
• – Dan Boschen Sep 18 '18 at 16:32