PiCW/pulse_shape.m

67 wiersze
1.6 KiB
Matlab

% Octave/ Matlab code used to explore the frequency domain effects of various
% pulse shaping functions.
pkg load signal
fs=1e6;
wpm=60;
ramp_excess=.3;
% Derive some values
period=1200/wpm*.001*2;
ramp_time=period/2*ramp_excess;
flat_time=period/2*(1-ramp_excess);
n_samp=round(period*fs);
n_ramp=round(ramp_time*fs);
n_flat=round(flat_time*fs);
printf('on_time = %5.2f ms\n',period/2*1000);
printf('ramp = %5.2f ms\n',ramp_time*1000);
% Different ramp functions
%ramp_func=@(x)x;
%ramp=ramp_func(linspace(0,1,n_ramp));
ramp_func=@(x)(-cos(x*pi)+1)/2;
ramp=ramp_func(linspace(0,1,n_ramp));
%ramp_func=@(x)repmat(1,1,length(x));
%ramp=ramp_func(linspace(0,1,n_ramp));
%ramp_func=@(x)exp(-(x-1).^2/(2*0.3^2));
%ramp=ramp_func(linspace(0,1,n_ramp));
%ramp=transpose(hamming(2*n_ramp+1));
%ramp=ramp(1:n_ramp);
%ramp=transpose(chebwin(2*n_ramp+1,100));
%ramp=ramp(1:n_ramp);
%ramp_func=@(x)(erf((x-0.5)*3.0)+1)/2;
%ramp=ramp_func(linspace(0,1,n_ramp));
ramp=ramp-ramp(1);
ramp=ramp/max(ramp)*1;
% Create signal
sig=[ramp ones(1,n_flat) fliplr(ramp) zeros(1,n_samp-n_flat-2*n_ramp)];
%sig=sig-mean(sig);
% Quantize
sig=round(sig*8)/8;
sig=sig+randn(1,length(sig))/10000;
% Plot frequency response
f=linspace(0,2*fs,n_samp+1);
f=f(1:end-1);
m=abs((fft(sig))).^2;
m=m/max(m);
plot(f,10*log10(m));
xlim([0 2000]);
ylim([-80 0]);
% Calculate occupied bandwidth
tot_pwr=sum(m(1:floor(length(m)/2)));
bw_percentage=0.999;
for obw=1:length(f)
if (sum(m(1:obw))/tot_pwr>bw_percentage)
break;
end
end
% Occupied bandwidth is from -2*fs/n_samp*obw to +2*fs/n_samp*obw.
fprintf('TX %5.2f%% cutoff frequency offset: %6.2f Hz\n',bw_percentage*100,2*fs/n_samp*obw);