Matematik

Matlab - bandpass filter?

06. december 2006 af Gonso (Slettet)
Jeg har en morse.wav fil, med et morse signal samt støj. Morse signalet har en frekvens på cirka 1100Hz.

I en .m fil, jeg har så skrevet følgende:

[y,fs,bits] = wavread('morse.wav');
x=filter(fdafilter,1,y);
sound(x,fs);

fdafilter er så lavet i fdatool, hvor følgende blev sat:
Response Type -> Bandpass
Design Method -> FIR -> Window
Filter Order -> Specify order: 1000
Options -> Window: Kaiser
Beta: .5
Frequency Specifications -> Fs = 44000
Fc1 = 1000
Fc2 = 1150

Via dette filter, får jeg et pænt morse signal uden støj.
Det som jeg så gerne vil, er at undgå at bruge fdatool, dvs få det nødvendig kode og funktioner skrevet i .m filen. Jeg har prøvet at expotere fdatool til en .m fil, men det kode den laver giver bare intet mening for mig.

Nogen her der kan hjælpe mig med det? :-)
PS. er ny i matlab ;-)

Brugbart svar (0)

Svar #1
06. december 2006 af Sentinox (Slettet)

Funktionen er rimelig kompliceret, og kræver nok en del tid at finde hoved og hale i.
Dog er det jo heldigvis en "builtin" så dukomentationen er som regel rimelig god.

Men jeg tror ikke umiddelbart du bare lige kan finde "de rigtige linier".

Men se den evt via:

edit fdatool

//Sentinox

Brugbart svar (0)

Svar #2
06. december 2006 af sigmund (Slettet)

"SPTool: A Signal Processing GUI Suite" er nok lige hvad du har brug for. For mere information om den, skriv "doc sptool" i en MATLAB prompt.

Brugbart svar (0)

Svar #3
06. december 2006 af sigmund (Slettet)

Jeg havde vist ikke læst den oprindelige post godt nok, fordi der ønskes en MATLAB-funktion, der gør dette, og ikke en GUI.

Svar #4
06. december 2006 af Gonso (Slettet)

Hmm, forstår jeg ikke ret meget af *g*

Men har fundet følgende:

% ex72.m
fs=10000;
fs2=fs/2;
f1=1000;
f2=3000;
[lpb,lpa]=butter(8,f1/fs2);
[bpb,bpa]=butter(8,[f1/fs2 f2/fs2]);
[hpb,hpa]=butter(8,f2/fs2,'high');
[lph,f]=freqz(lpb,lpa,512,fs);
[bph,f]=freqz(bpb,bpa,512,fs);
[hph,f]=freqz(hpb,hpa,512,fs);
plot(f,20*log10(abs(lph)+eps),'r-',f,20*log10(abs(bph)+eps),'g-',f,20*log10(abs(hph)+eps),'b-');

Her er der både lav, høj og bandpass... har prøver mig lidt frem med at slette og redigere... den bliver bare ved med at sige der mangler en variabel.

Svar #5
06. december 2006 af Gonso (Slettet)

Det jeg satter i fdatool, skal jo egentlig "bare" skrives manuelt i min .m fil... men eftersom jeg er rimelig ny i matlab, er selv 2+2 svært (groft sagt) *gg*

Brugbart svar (0)

Svar #6
06. december 2006 af sigmund (Slettet)

Måske kan http://users.ece.gatech.edu/~bonnie/book/TUTORIAL/tutorial.pdf eller http://www.mathworks.com/academia/student_center/homework/signal/signal_problem1.html være til hjælp.

Svar #7
06. december 2006 af Gonso (Slettet)

Uh ja, det ser godt ud :-) Tak sigmund.

Men om jeg kan få mit filter til at virke ud fra det, er vist et godt spørgsmål ;-) Men jeg prøver.

Brugbart svar (0)

Svar #8
06. december 2006 af sigmund (Slettet)

For en god ordens skyld skal det nævnes, at jeg har aldrig beskæftiget mig med signalanalyse, og kan derfor ikke hjælpe dig med det konkrete problem. I stedet kan jeg måske finde nogen gode links, der beskriver noget MATLAB-kode, fordi det er åbenbart selve kodningen, der volder dig problemer.

Dog har jeg en del erfaring med MATLAB, men det er mest i forbindelse med løsning af differentialligninger og systemer af sådanne.

Brugbart svar (0)

Svar #9
06. december 2006 af fixer (Slettet)

Jeg arbejder dagligt med signalanalyse, hvis der skulle blive behov for assistance der.

Tør man spørge hvorfor du ikke er tilfreds med fdatool?

Svar #10
06. december 2006 af Gonso (Slettet)

fixer -> Jamen det er fordi at jeg synes det er bedst at have filtret som kode i .m filen, og ikke som noget man "bare" indstiller gennem grafisk brugerflade.
Jamen så må du da lige være manden der kan fortælle, hvordan jeg får lavet det filter i min .m fil :-)

Brugbart svar (0)

Svar #11
06. december 2006 af fixer (Slettet)

Vælg File -> Generate M-file medmindre du har skabt filteret med pol-nulpunktseditoren, men det lader det ikke til.

Svar #12
06. december 2006 af Gonso (Slettet)

Som skrevet i første indlæg, så giver koden ingen mening for mig :-(

#####################################################

function Hd = fdatoolexport
%FDATOOLEXPORT Returns a discrete-time filter object

%
% M-File generated by MATLAB(R) 7.0.1 and the Signal Processing Toolbox 6.2.1.
%
% Generated on: 06-Dec-2006 13:41:57
%

% FIR Window Bandpass filter designed using the FIR1 function.

% All frequency values are in Hz.
Fs = 44000; % Sampling Frequency

N = 1000; % Order
Fc1 = 1000; % First Cutoff Frequency
Fc2 = 1150; % Second Cutoff Frequency
flag = 'noscale'; % Sampling Flag
Beta = 0.5; % Window Parameter
% Create the window vector for the design algorithm.
win = kaiser(N+1, Beta);

% Calculate the coefficients using the FIR1 function.
b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);


% [EOF]

#####################################################

Svar #13
06. december 2006 af Gonso (Slettet)

Tror jeg er kommet en smule på sporet af noget... mangler bare hjælp til at gøre den færdig, for jeg er stået af nu.

#####################################################

[y,fs,bits] = wavread('morse(st++j).wav');
x=filter(d,1,y);
sound(x,fs);

flp = 1000;
fhi = 1150;
npts = length(y); %44000 cirka
delt = 1000;


function [d]=bandpass(c,flp,fhi,npts,delt)
%
% [d]=bandpass(c,flp)
%
% bandpass a time series with a 2nd order butterworth filter
%
% c = input time series
% flp = lowpass corner frequency of filter
% fhi = hipass corner frequency
% npts = samples in data
% delt = sampling interval of data
%
n=2; % 2nd order butterworth filter
fnq=1/(2*delt); % Nyquist frequency
Wn=[flp/fnq fhi/fnq]; % butterworth bandpass non-dimensional frequency
[b,a]=butter(n,Wn); % construct the filter
d=filtfilt(b,a,c); % zero phase filter the data
return;

#####################################################

Men disse tre indstillinger jeg foretog i fdatool, kan jeg ikke rigtig se hvor og hvordan skal implementeres... hvis det da overhovedet er nødvendigt.
Design Method -> FIR -> Window
Options -> Window: Kaiser
Beta: .5

Brugbart svar (0)

Svar #14
07. december 2006 af fixer (Slettet)

Jeg forstår overhovedet ikke hvad du vil. Du har lavet et filter via fdatool, genereret en M-fil og hvad vil du så? Er du igang med totalt at omskrive den genererede M-fil; er #13 et forsøg på at omskrive #12 ?

Svar #15
07. december 2006 af Gonso (Slettet)

Jamen jeg vil gerne lave filtret uden brug af fdatool.

#13 er et forsøg på at lave det selv, ud fra noget jeg fandt på nettet. Det går bare ikke særlig godt.

Svar #16
07. december 2006 af Gonso (Slettet)

Har lige set at "c" ikke er defineret i #13... men hvad er "c"?? Der står at: c = input time series

Brugbart svar (0)

Svar #17
07. december 2006 af sigmund (Slettet)

#16,

Som vist i #13, så er c input til funktionen bandpass.

Brugbart svar (0)

Svar #18
07. december 2006 af fixer (Slettet)

Det er to helt forskellige filtre du prøver at lave.

Med fdatool har du designet et Kaiser windowed FIR filter med vinduesmetoden.

Dit eget filter er et Butterworthfilter, som er en helt anden filterdesignmetode.

Jeg kan ikke forstå hvad du vil med M-filen fra fdatoolet, idet du jo mere eller mindre er nødt til at smide det hele overbord, hvis det er et Butterworthfilter du vil lave.


Svar #19
07. december 2006 af Gonso (Slettet)

Ja, med hvad er dens værdi... kan ikke lige tyde hvad "input time series" er for noget. Altså c skal jo være lig med et eller andet.

Svar #20
07. december 2006 af Gonso (Slettet)

Jamen så lad mig omformulere problemet totalt.

Haves: .wav fil indeholdene morse signal med støj.

Der skal laves en .m fil, der indlæser .wav filen, kører bandpass filter på den, hvor frekvenserne mellem 1000 og 1150Hz skal "slippe" igennem.

I første indlæg prøvede jeg med fdatool, som med de indstillinger beskrevet, gav et rigrig flot resultat.

Opgaven må bare IKKE løses ved at bruge fdatool.

Forrige 1 2 Næste

Der er 24 svar til dette spørgsmål. Der vises 20 svar per side. Spørgsmålet kan besvares på den sidste side. Klik her for at gå til den sidste side.