Matematik
Matlab - bandpass filter?
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 ;-)
Svar #1
06. december 2006 af Sentinox (Slettet)
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
Svar #2
06. december 2006 af sigmund (Slettet)
Svar #3
06. december 2006 af sigmund (Slettet)
Svar #4
06. december 2006 af Gonso (Slettet)
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)
Svar #6
06. december 2006 af sigmund (Slettet)
Svar #7
06. december 2006 af Gonso (Slettet)
Men om jeg kan få mit filter til at virke ud fra det, er vist et godt spørgsmål ;-) Men jeg prøver.
Svar #8
06. december 2006 af sigmund (Slettet)
Dog har jeg en del erfaring med MATLAB, men det er mest i forbindelse med løsning af differentialligninger og systemer af sådanne.
Svar #9
06. december 2006 af fixer (Slettet)
Tør man spørge hvorfor du ikke er tilfreds med fdatool?
Svar #10
06. december 2006 af Gonso (Slettet)
Jamen så må du da lige være manden der kan fortælle, hvordan jeg får lavet det filter i min .m fil :-)
Svar #11
06. december 2006 af fixer (Slettet)
Svar #12
06. december 2006 af Gonso (Slettet)
#####################################################
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)
#####################################################
[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
Svar #14
07. december 2006 af fixer (Slettet)
Svar #15
07. december 2006 af Gonso (Slettet)
#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)
Svar #17
07. december 2006 af sigmund (Slettet)
Som vist i #13, så er c input til funktionen bandpass.
Svar #18
07. december 2006 af fixer (Slettet)
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)
Svar #20
07. december 2006 af Gonso (Slettet)
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.
