MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Áron Laczkovits on 14 Aug 2013

Hi all!

I just want to play 2 or more different signals at the same time. If i know well for this, i need to summarize the signals, and the just play back it, but the matrix dimensions musn't agree. Can anyone help me to solve the problem?

Thanks in advance

I tried it with this source code:

clear;

clc;

myFolder = 'C:\Users\Aron\Samples\proba';

if exist(myFolder, 'dir') ~= 7

Message = sprintf('Error: The following folder does not exist:\n%s', myFolder);

uiwait(warndlg(Message));

return;

end

filePattern = fullfile(myFolder, '*.wav');

wavFiles = dir(filePattern);

sampleArray = cell(length(wavFiles),1);

Fs = zeros(size(sampleArray));

for k = 1:length(wavFiles)

baseFileName = wavFiles(k).name;

fullFileName = fullfile(myFolder, baseFileName);

fprintf(1, 'Now reading %s\n', fullFileName);

[sampleArray{k}, Fs(k)] = wavread(fullFileName);

end

s=1;

data_1=(sampleArray{s});

%sound(data_1);

%%

L = length(data_1);

NFFT = 2^nextpow2(L); % Next power of 2 from length of y

Y = fft(data_1,NFFT)/L;

f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.

figure(1);

plot(f,2*abs(Y(1:NFFT/2+1)))

title('Single-Sided Amplitude Spectrum of y(t)')

xlabel('Frequency (Hz)')

ylabel('|Y(f)|')

%%

g=9;

data_2=(sampleArray{g});

L = length(data_2);

NFFT = 2^nextpow2(L); % Next power of 2 from length of y

X = fft(data_2,NFFT)/L;

f = Fs/2*linspace(0,1,NFFT/2+1);

data_sum=Y+X;

data_sum_in_time = ifft(data_sum,NFFT)*L;

sound (data_sum_in_time);

*No products are associated with this question.*

Answer by Iain on 21 Aug 2013

Signal A: 10,000 samples, sampled at 20KHz Signal B: 5,000 samples, sampled at 20KHz

A(samples_offset+(1:5000)) = A(samples_offset+(1:5000)) + B; %set the offset to play signal B starting at the same time, ending at the same time, or somethign in the middle.

Signal A: 10,000 samples, sampled at 20KHz Signal B: 5,000 samples, sampled at 10KHz

Here you need to resample B. You can do it via interpolation. - Something like:

C(1:2:9999) = B; C(2:2:9998) = B(1:end-1) + B(2:end) ./ 2 C(10000) = B(end);

Áron Laczkovits on 26 Aug 2013

And what if i have a sample library with different samples (and i dont know the sampling rate) and i want to add them, because i would like to play for example 2 or 3 samples at the same time, like a sampler. I need a conversation for all? or what?

Thx in advance

dpb on 26 Aug 2013

How can you do anything w/ them if the sampling rate isn't known (or at least embedded in the storage format)?

The answer to the question is as given earlier; you have to resample one or both to a common time base in some fashion of your choosing. If you don't want to use the Signal Processing Toolbox **resample** function, then roll your own...

Answer by Walter Roberson on 26 Aug 2013

Respampled = ifft( fft(SampleWithLowerFrequency), ceil(length(SampleWithLowerFrequency) * HigherFrequency / LowerFrequency ) )

now play SampleWithHigherFrequency and Resampled together, both at HigherFrequency

Show 8 older comments

Walter Roberson on 28 Aug 2013

resample(data_1,1,1) is going to give you exactly data_1 back. You should be resampling to match the highest frequency. To get the p, q pair of integers to use for resample(),

[p, q] = rat(Maximum_Frequency ./ Current_Frequency);

Áron Laczkovits on 2 Sep 2013

@dpl

Why minLeng=min(length(sampleArray{k})) doesn't return the shortest sample?

It's not the shortest one as i see and hear...

The two sample's length values are: l1: 176400 and L2: 17656

And minLeng value is: 19962

## 7 Comments

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_164327

I am not sure what you mean by "summarize" a signal ?

I think you are possibly saying that you have two input signals, usually of different length, and you want to play them simultaneously and for the same duration. Do you want the longer one to be pitch-compressed to the duration of the shorter one? Do you want the shorter one re-sampled to the longer duration ?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165269

I just want to play them at the same time. i don't want to pitch-compressed the longer one. I need a bit help, how can I quantize them to play them at the same time, like a sampler. Do you have any idea?

Thx in advance

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165279

If you have the signal processing toolbox, probably easiest would be just to use resample to a common timebase.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165283

Will each of the signals be mono? And to play them "at the same time" would it be okay to play one on the "left" and the other on the "right"? Or are they both stereo and you want them mixed? Or are they both stereo and you want them to be output to different sound cards ?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165291

Well, all of my samples are stereo, and i want to play them at the same time, with add them (mixed them). I have only one sound card. I'm just trying to programing a simple sampler, and therefore i would like to add different signals for playing them at the same time. It's works with same length signals, but i am getting stuck with different length signals. So i want to add the signals from the beginings of each, but i don't know how. And 1 more thing: i don't want to use any toolboxes, just source code.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165297

If sample A is longer than sample B, then after B finishes playing, should the rest of A play by itself, or should one go back to the beginning of B and keep going from there until the end of A ?

Are the samples always taken at the same sampling rate, or does there need to be conversion ?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/84730#comment_165361

If sample A is longer than sample B, after B finishes playing, the rest from A should continue playing till end. So it's only need a simple addition from the beginning of each other until the longest sample finishes? (not sure that all sample has the same sample rate, it's a bit complicate the task)

Maybe I need a conversation that convert all sample to the same sample rate. i don't know what should i do if i have a sound library with different length sound signals and doesn't known the sampling rate between the signals and i would like to play them even if more than two.