Jag har avkodat lite av signalen och kommit så långt att landskoden är 'U' och ett första meddelande är av typ 'A', meddelandenummer '06', och det är ju väldigt likt det du plockat fram, så nu känns det stabilt.
För detta jobbet har jag använt (gnu) octave, som är en öppen och väldigt kompatibel variant av Matlab som funkar överallt. I denna posten kommer som ett preludium insignalens spektrum och en naiv bandpassfiltrering.
Först konverterade jag filen till WAV-formatet via sox. Det skulle säkert gå bra med ffmpeg eller något annat program också.
(Massor av varningslampor tänds här - konverterar den rätt? Hur ser datan ut? osv, men jag har struntat i det och gått vidare. Någon gång bör man kanske backa och kolla detta steg mera i detalj.)
Sedan kommer octave-programmet. Först sätter vi några konstanter och läser in filen. (Jag hade issues med octave på gamla debian 7, man skall nog köra octave 4 eller mera.)
Kod: Markera allt
# Set sample rate
Fs = 8000;
# Wanted signal center frequency
Fc = 1385;
# Read "received" signal into r
r = audioread('rost.wav');
och så plottar vi spektrum. Matlabs plot-syntax lämnar en del övrigt att önska.
Kod: Markera allt
# plot input signal power spectrum
figure(1); subplot(2,1,1);
plot((0:length(r)-1)/length(r)*Fs, 20*log10(abs(fft(r))));
axis([0,Fs/2,0,50])
grid on
xlabel 'Hz';
ylabel 'dB'
title 'input signal spectrum'
plot tar två invektorer (x,y) som plottas mot varandra. Därför den där "(0:length..."-grejen som bara är till för att skapa en vettig frekvensaxel på grafen.
Sedan skapar vi ett enkelt filter
Kod: Markera allt
# Create a simple bandpass filter. NB: length is actually Ntaps+1. Sorry.
Ntaps = 70;
h = sinc(2*(-(Ntaps/2):(Ntaps/2))/(Ntaps/2)) .* sinc((-(Ntaps/2):(Ntaps/2))/(Ntaps/2)) .* exp(j*2*pi*Fc/Fs*(0:Ntaps));
h = h ./ (h*h'); # normalise amplitude
Strunta i detta om det är oklart. Det är bara genereringen av filtertappar till ett bandpassfilter. Det är en sinc som fönstras med en annan sinc och som sedan "skruvas upp" till den önskade centerfrekvensen. Sincfilter approximerar ett rektangulärt utsnitt i spektrum, och det bättras på lite med fönstringen. Det blir ett lågpassfilter, så därav multiplikationen med exp(...) för att skicka upp den i frekvens.
Filtrera sedan insignalen med bandpassfiltret
Kod: Markera allt
# bandpass filter receied signal
r_filtered = filter(h,1,r);
Här är "h" FIR-tapparna och "1" IIR-tapparna. Det är alltså ett rent FIR-filter. Plotta sedan
Kod: Markera allt
# plot filtered signal power spectrum
figure(1); subplot(2,1,2);
plot((0:length(r)-1)/length(r)*Fs, 20*log10(abs(fft(r_filtered))));
axis([0,Fs/2,0,50])
grid on
xlabel 'Hz';
ylabel 'dB'
title 'spectrum after IF filter'
Såhär ser det ut.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.