2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 IQ сигнал матлаб
Сообщение14.03.2021, 09:46 
Доброго времени. Создал лчм сигнал, теперь хочу задать его комплексным, и вывести в wav. Возникает ошибка и появляются вопросы.
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
fs = 16000; % частота дискретизации
f0 = 100; % начальная частота
f1 = 8000; % конечная частота
A = 1; % амплитуда

fcarrier = (f0 + f1) / 2;
omega = f1 - f0;
tf = 2; % время излучения сигнала

%один импульс
t = 0 : 1/fs : tf - 1/fs;
t1 = -tf/2 : 1/fs : tf/2 - 1/fs;

Sre = A*cos(2 * pi * fcarrier .* t + 2 * pi * omega * t1.^2 / (2*tf));
Sim = A*sin(2 * pi * fcarrier .* t + 2 * pi * omega * t1.^2 / (2*tf));
s = complex(Sre, Sim);
s = A*exp(1i * 2 * pi * fcarrier .* t + 2 * pi * omega * t1.^2 / (2*tf));

% повторение импульса
nChirps = 5; % Число повторений
tpause = 2; % пауза (2 секунды)
chirpMulti = s;
for i = 1:nChirps-1
    %chirpMulti = repmat([s zeros(1, tpause * fs)], 1, nChirps); % повторение излучения с паузой в tpause секунд
    chirpMulti = [chirpMulti, s]; % Повторение излучения без паузы
end

% график временной области
dt = 1/fs;
n = length(chirpMulti);
t = 0:dt:(n-1)*dt;
plot(t, chirpMulti);

% спектр
Spc = abs(fft(chirpMulti));
fx = fs/2*linspace(-1,1,length(Spc));
figure, plot(fx,fftshift(Spc))
grid on
xlim([0 20])
title('спектр лчм сигнала')
xlabel('Частота, Гц')

% запись в wav
%sound(chirpMulti,fs);
filename='D:\Vlad\ML\Chirp\chirp_pause_2sec.wav';
audiowrite(filename,chirpMulti,fs)
 


Появляется предупреждение:
Warning: Imaginary parts of complex X and/or Y arguments ignored
> In chirp_signal (line 42)

Warning: Data clipped when writing file.
In audiowrite>clipInputData (line 404)
In audiowrite (line 184)
In chirp_signal (line 56)


Это может быть связано с тем, что комплексный сигнал должен записываться в wav в 2 канала, но не могу понять, как осуществить.

Отдельно генерировал без записи в файл, все нормально:
Используется синтаксис Matlab M
Fs = 48000;
F = 1000;
t = 0 : 1/Fs: 0.1;
S0 = 1;
phase = 0;

Sre = 0.5 * S0 * cos(2*pi*F*t+phase);
Sim = 0.5 * S0 * sin(2*pi*F*t+phase);
S = complex(Sre, Sim);
Sp = S0*exp(1i*2*pi*F*t+phase);

Fc = 15e3;
Sm = Sre.*cos(2*pi*Fc*t+phase);
 


Можно ли указывать при записи wav количество каналов, битность и частоту дискретизации файла? Частота дискретизации, как полагаю, будет той же, что задал в коде..

 
 
 
 Re: IQ сигнал матлаб
Сообщение14.03.2021, 17:20 
Тада (это ссылка на официальную документацию по функции audiowrite). Как понимаю, никакого преобразования комплексных чисел в пары действительных та функция сама делать не будет всё равно — это стоит сделать заранее, взяв от того массива real и imag и соединив их в одну матрицу.

-- Вс мар 14, 2021 19:22:38 --

Dr Blue в сообщении #1509141 писал(а):
Частота дискретизации, как полагаю, будет той же, что задал в коде..
Конечно, последний обязательный аргумент она и есть. Количество каналов определится по размеру матрицы. Ну а битность указывать дополнительными параметрами как указано по ссылке.

 
 
 
 Re: IQ сигнал матлаб
Сообщение15.03.2021, 07:38 
arseniiv в сообщении #1509221 писал(а):
это стоит сделать заранее, взяв от того массива real и imag и соединив их в одну матрицу.

-- Вс мар 14, 2021 19:22:38 --

Если правильно понял:
Используется синтаксис Matlab M
Sre = 0.5 * S0 * cos(2*pi*F*t+phase);
Sim = 0.5 * S0 * sin(2*pi*F*t+phase);
S = complex(Sre, Sim);
Sp = S0*exp(1i*2*pi*F*t+phase);
X = real(Sp);
Y = imag(Sp);
C = [X,Y];
...
filename='D:\modulation.wav';
audiowrite(filename,C,Fs)
 

 
 
 
 Re: IQ сигнал матлаб
Сообщение15.03.2021, 15:52 
Главное чтоб работало — сам я не знаю как собрать два массива в матрицу в матлабе. :-) Если не сработает, то может быть нужно транспонировать C.

 
 
 
 Re: IQ сигнал матлаб
Сообщение15.03.2021, 17:34 
arseniiv
Используется синтаксис Matlab M
samples = 2 * pi * fcarrier .* t + 2 * pi * omega * t1.^2 / (2*tf);

%s = A*cos(samples) + j*A*sin(samples);
s = A*exp(j*samples); % комплексный лчм

% повторение импульса
nChirps = 2; % Число повторений
tpause = 2; % пауза (2 секунды)
z = complex(zeros(1, tpause*fs));
chirpMulti = repmat([s z], nChirps);


Как-то так, работает)

Спасибо за идею, работаю дальше)

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group