SOS σε εργασια στο matlab.
collapse
 
 
Καλώς ορίσατε, Επισκέπτης. Παρακαλούμε συνδεθείτε ή εγγραφείτε.
Χάσατε το email ενεργοποίησης;
Agenda
Σελίδες: [1]   Κάτω
  Εκτύπωση  
Αποστολέας Θέμα: SOS σε εργασια στο matlab.  (Αναγνώστηκε 2184 φορές)
0 μέλη και 1 επισκέπτης διαβάζουν αυτό το θέμα.
Tablet
Συναλλαγές: (2)
Musician
*

Karma: 0
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 110



« στις: 16:34 - 04/02/10 »

Χερετω ολους.Εχω μια εργασια στο matlab και θα ηθελα τη βοηθεια καποιου που γνωριζει.
Σε 3 πραγματα.

1)Θελω να δημιουργησω μουσικο κομματι εχοντας μια συναρτηση tone.m  για τις μουσικες νοτες(μου δινεται παρτιτουρα) και μια adsr για να εφαρμοσω την περιβαλλουσα.
2)Εχω να δημιουρφησω ενα ψηφιακο υψηπερατο φίλτρο με συχνοτητα αποκοπης 500 Hz
και να φιλτράρω το παραπάνω μουσικό κομματι.
3)Θελω να εμφανισω την αποκριση συχνότητας του φίλτρου καθως και την γραφική παράσταση στο πεδιο συχνότητας του παραπανω κομματιου πριν και μετα το φιλτράρισμα.

Τα φωτα σας αν εχετε την καλοσύνη..Χανω το μαθημα...... Sad
Καταγράφηκε

Gaping the mind..
theoctapus
Συναλλαγές: (3)
Star
****

Karma: 3
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 4874



« Απάντηση #1 στις: 16:51 - 04/02/10 »

Για check this out

http://www.mathworks.com/access/helpdesk/help/toolbox/filterdesign/ref/fdesign.highpass.html

Δυστυχώς έχω να πιάσω matlab τουλαχιστον μια τετραετία, οπότε...
Καταγράφηκε

Ο Αριστοτέλης γίνεται κτήμα του Γερμανού που τον μελετά, όχι του Έλληνα που τον αγνοεί
Tablet
Συναλλαγές: (2)
Musician
*

Karma: 0
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 110



« Απάντηση #2 στις: 19:01 - 04/02/10 »

Kατι βοήθησε  βέβαια κάθε βοήθεια δεκτή
Καταγράφηκε

Gaping the mind..
harilatron
Moderator
Συναλλαγές: (2)
*

Karma: 0
Συνδεδεμένος Συνδεδεμένος

Φύλο: Άντρας
Μηνύματα: 8123



« Απάντηση #3 στις: 19:21 - 04/02/10 »

1. H tone.m τι κάνει? Την έχετε? Τι ορίσματα παίρνει? (Ρίξτην ενα copy-paste... attachment   δεν μπορεί να μπει...)

2. Δες τα tutorial στο σχετικό toolbox (filter design νομίζω λέγεται).

3. Το πρώτο γίνεται αν ξέρεις το φίλτρο, το δεύτερο θα χρειαστείς τους FFT του κομματιού και του επεξεργασμένου.
Καταγράφηκε
tanS
Συναλλαγές: (1)
Musician
*

Karma: 0
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 108


« Απάντηση #4 στις: 19:49 - 04/02/10 »

Χερετω ολους.Εχω μια εργασια στο matlab και θα ηθελα τη βοηθεια καποιου που γνωριζει.
Σε 3 πραγματα.

1)Θελω να δημιουργησω μουσικο κομματι εχοντας μια συναρτηση tone.m  για τις μουσικες νοτες(μου δινεται παρτιτουρα) και μια adsr για να εφαρμοσω την περιβαλλουσα.
2)Εχω να δημιουρφησω ενα ψηφιακο υψηπερατο φίλτρο με συχνοτητα αποκοπης 500 Hz
και να φιλτράρω το παραπάνω μουσικό κομματι.

Με ενδιαφέρει και εμένα το θέμα αυτό , γι αυτό αν είναι ευκολο δώσε τις συναρτήσεις στο function σου , να δω αν μπορω να σε βοηθήσω.
Καταγράφηκε
infectme247
Συναλλαγές: (0)
Musician
*

Karma: 3
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 318


« Απάντηση #5 στις: 19:56 - 04/02/10 »

φίλε μου, θεωρητικά μπορώ να σε βοηθήσω και στα 3 που ρωτάς, αλλά εσύ μάλλον θέλεις κώδικα, και εγώ δεν έχω ιδέα από matlab. Μόνο mathematica.
Παλιά την είχα ψάξει πολύ με realtime ψηφιακά φίλτρα, αλλά δεν θυμάμαι και πολλά πλέον. Όλο και θα έχω κάπου κάτι ξεχασμένο, θα ψάξω. Είχα πολύ υλικό στα favourites αλλά μετά το τελευταίο format αγνοείται η τύχη τους!! :-/

1. Τι ακριβώς θέλεις από την tone.m; Απλό ημίτονο θα βγάζει? Η adsr απλά θα δίνει έναν συντελεστή ο οποιός θα πολλαπλασιάζεται με το output της tone.m?

2. Το φίλτρο που θέλεις θα έχει τη γενική μορφή y[n] = a*x[n] + b*x[n-1], όπου y θα είναι τα φιλτραρισμένα samples, x τα source samples, και a,b σταθερές που καθορίζουν την απόκριση του φίλτρου. Θα πρέπει να κάνεις μια λούπα ίση με τον αριθμό των samples, όπου θα γράφεις στην θέση "i" της εξόδου y[ i ], την τιμή a*x[ i ] + b*x[i-1].

3. Η συχνοτική απόκριση δίνεται από έτοιμο τύπο για αυτή τη μορφή φίλτρου, μπορείς να την κάνεις plot κατευθείαν. Για την συχνοτική παράσταση του κομματιού -όπως είπε και harilatron- θα χρειαστείς κάποιον αλγόριθμο fourier (πχ FFT)
 
Καταγράφηκε
Tablet
Συναλλαγές: (2)
Musician
*

Karma: 0
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 110



« Απάντηση #6 στις: 20:32 - 04/02/10 »

Παιδια πραγματικα με σωνετε ολοι κανω attachment την εργασια.
Eυχαριστω και παλι

* Matlab.zip (50.13 KB - έγινε λήψη 45 φορές.)
Καταγράφηκε

Gaping the mind..
infectme247
Συναλλαγές: (0)
Musician
*

Karma: 3
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 318


« Απάντηση #7 στις: 20:33 - 04/02/10 »

Βρήκα κάτι που είχα φτιάξει, είναι σε mathematica. Δείχνει πώς μπορείς να πάρεις την συχνοτική απόκριση και την απόκριση φάσης, για αυτόν τον τύπο φίλτρου.

Κώδικας:
a = .75;
b = .25;
T = 1./44100;
Gain[ω_] := (a + b)^2 - 4 a b Sin[ω T/2] + (a^2 - b^2) Sin[ω T]
Phase[ω_] := ArcTan[(b Sin[ω T])/(a + b Cos[ω T])]


gn = {};
pf = {};
For[f = 0, f < 22050, f += 20,
  pg = {f, Gain[2 π f]};
  pph = {f, Phase[2 π f]};
  AppendTo[gn, pg];
  AppendTo[pf, pph];
  ];


ListLinePlot[gn]
ListLinePlot[pf]

Βέβαια, αυτό είναι lowpass φίλτρο. Νομίζω ότι το high pass προκύπτει αν αντικαταστήσεις το ω με 1/ω ή 1-ω στoν τύπο του gain και του phase, αλλά δεν είμαι σίγουρος. Η πρώτη εικόνα είναι η απόκριση συχνοτήτων, και η δεύτερη η απόκριση φάσης. Αν θες διπλάσια db/oct, εφαρμόζεις ξανά το φίλτρο στην έξοδο.

Δες επίσης το http://en.wikipedia.org/wiki/High-pass_filter, έχει έτοιμο παράδειγμα highpass φίλτρου.


* amp response.GIF (2.54 KB, 360x217 - εμφανίστηκε 67 φορές.)

* phase response.GIF (3.06 KB, 360x225 - εμφανίστηκε 54 φορές.)
Καταγράφηκε
Tablet
Συναλλαγές: (2)
Musician
*

Karma: 0
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 110



« Απάντηση #8 στις: 14:13 - 05/02/10 »

Oποιος βρει ακρη με την εργασια ας μου στειλει κανα pm.
Smiley
Καταγράφηκε

Gaping the mind..
infectme247
Συναλλαγές: (0)
Musician
*

Karma: 3
Αποσυνδεδεμένος Αποσυνδεδεμένος

Μηνύματα: 318


« Απάντηση #9 στις: 20:00 - 05/02/10 »

Oποιος βρει ακρη με την εργασια ας μου στειλει κανα pm.
Smiley

Έριξα μια ματιά στα αρχεία που ανέβασες, ανοίγουν και με απλό text editor. Αν και δεν ξέρω πως χρησιμοποιούνται μέσα απ'το interface του matlab, αλλά χονδρικά αυτό είναι το τι κάνουν...

Το tone.m
Κώδικας:
// Η συνάρτηση παίρνει δύο τιμές, έναν ακέραιο από 0 ως 87 που αντιστοιχεί στο πλήκτρο της νότας στο κλαβιέ (η A3 είναι το 49) και τη συνολική διάρκεια για τη νότα
function note=tone(key,dur)
fs=20000;  // εδώ ορίζει την δειγματοληψία σε samples ανά second
t=0:1/fs:dur;  // δημιουργεί μια λίστα με τις χρονικές τιμές σε δευτερόλεπτα για κάθε sample

// υπολογίζει την συχνότητα της νότας με βάση την A3 (440Hz) Ο τύπος προκύπτει έτσι, επειδή η συχνότητα κάθε νότας πρέπει να πολλαπλασιαστεί με 2^(1/12) για να πάρεις την επόμενη. (Αν ανέβεις μια οκτάβα, η συχνότητα γίνεται διπλάσια)
fkey=440*2^((key-49)/12); 

//επιστρέφει μια λίστα τιμών, που είναι ο ήχος της νότας με συγκεκριμένη διάρκεια.
note=sin(2*pi*fkey*t);



Το adsr.m
Κώδικας:
// ζητάει μέσω ενός dialog τις χρονικές τιμές Tattack, Tdecay και Trelease και την ένταση του Asustain
prompt={'give the ATTACK duration:','give the DECAY duration:','give the SUSTAIN amplitude:','Give the RELEASE duration:'};
name='Inputs for the ADSR';
numlines=1;
%defaultansewr={};
answer=inputdlg(prompt,name,numlines);

Tattack=str2num(answer{1});
Tdecay=str2num(answer{2});
Asustain=str2num(answer{3});
Trelease=str2num(answer{4});

// Δημιουργεί λίστες με τις χρονικές στιγμές που αντιστοιχούν σε κάθε τμήμα της περιβάλλουσας. H πρώτη λίστα 't' καλύπτει όλη την διάρκεια της νότας, η 't1' είναι οι διαδοχικές χρονικές στιγμές που αντιστοιχούν στο τμήμα attack, κτλ.
t = 0:(1/fs):dur;
t1 = 0:(1/fs):((dur*Tattack)-(1/fs));
t2=(dur*Tattack):(1/fs):((dur*Tattack+dur*Tdecay)-(1/fs));
t3=(dur*Tattack+dur*Tdecay):(1/fs):((dur-dur*Trelease)-(1/fs));
t4=(dur-dur*Trelease):(1/fs):dur;


// Δημιουργεί λίστες που είναι οι συντελεστές για την ένταση της νότας σε κάθε φάση της περιβάλλουσας. Πχ. στο attack η λίστα έχει τιμές που αυξάνουν διαδοχικά από 0 (silence) σε πλήρη ένταση (1), στο decay πέφτουν από 1 ως Αsustain, μετά μένουν σταθερά στην τιμή Asustain και μετά πέφτουν σταδιακά στο 0.
attack =1/(Tattack*dur)*t1;
decay =1+((Asustain-1)/(Tdecay*dur))*(t2-Tattack*dur);
sustain(1:(length(t3)))=Asustain;
release = Asustain-(Asustain/(dur-(dur-dur*Trelease)))*(t4-(dur-dur*Trelease));

// Ενώνει τους συντελεστές για την περιβάλλουσα σε μία λίστα
ADSR=[attack, decay, sustain, release];

// σχεδιάζει στον άξονα x τις χρονικές στιγμές για όλη τη διάρκεια της περιβάλλουσας και στον y τις αντίστοιχες εντάσεις της περιβάλλουσας.
figure, plot(t,ADSR)

// επιστρέφει τους συντελεστές για την ένταση
A=ADSR;


Εσύ πρέπει να δημιουργήσεις μία άδεια λίστα με θέσεις όσα τα samples για όλο το κομμάτι (αυτό θα εξαρτηθεί από το επιθυμητό tempo και αριθμό μέτρων του κομματιού) και να γράφεις σε κατάλληλες θέσεις* τις εξόδους της tone.m και adsr πολλαπλασιασμένες στοιχείο προς στοιχείο.

*Θα πρέπει να μπορείς να αντιστοιχήσεις τον μουσικό χρόνο για κάποια νότα από METΡΑ:BEAT:TETARTA TOY BEAT σε δευτερόλεπτα, και ακολούθως σε αντίστοιχο αριθμό sample. Για χρόνο 4/4 μπορείς να χρησιμοποιήσεις την έκφραση: αριθμός sample = int( fs*( 60*(4*(METRA-1) + (BEAT-1) + "TETARTA TOY BEAT"/4 ) / BPM ) )
Σε αυτόν τον αριθμό sample θα πρέπει να γράψεις την έξοδο της tone πολλαπλασιασμένη με την έξοδο της adsr με τα κατάλληλα δεδομένα για κάθε νότα.

Έτσι δημιουργείς το κομμάτι. Μετά πρέπει να υλοποιήσεις το φίλτρο και σε μια loop να γράφεις sample προς sample την φιλτραρισμένη έξοδο, σύμφωνα με τον τρόπο που ανέφερα και στο προηγούμενο ποστ. Oι σταθερές a,b θα καθορίζουν την συχνότητα αποκοπής του φίλτρου και ΘΑ ΠΡΕΠΕΙ ΝΑ ΔΙΑΒΑΣΕΙΣ ΣΧΕΤΙΚΑ ώστε να δεις πώς προκύπτουν. Είναι το άλφα και το ωμέγα του μαθήματος. Και να θυμόμουν πώς βγαίνουν  Grin δεν θα σου'λεγα...

Την συχνοτική απόκριση σου έδειξα πώς μπορείς να τη βρεις. Είναι ουσιαστικά το μέτρο της transfer function του φίλτρου σου. Για το συχνοτικό φάσμα του 'unfiltered' κομματιού, είμαι 100% σίγουρος ότι η matlab θα έχει κάποια υλοποίηση FFT. Για το φιλτραρισμένο συχνοτικό φάσμα, είτε κάνεις πάλι FFT (δηλαδή στο φιλτραρισμένο κομμάτι), είτε χρησιμοποιείς το θεώρημα της ενέλιξης που λέει ότι το φάσμα του φιλτραρισμένου σήματος θα είναι το γινόμενο του 'unfiltered' σήματος με το φάσμα του συχνοτικής απόκρισης του φίλτρου.


Δεν νομίζω να μπορώ να σε βοηθήσω περισσότερο. Καλή επιτυχία.
btw, στο doc αρχείο έλεγε ότι η προθεσμία ήταν αρχές γενάρη... ελπίζω να μην ισχύει
Καταγράφηκε
Σελίδες: [1]   Πάνω
  Εκτύπωση  
 
Μεταπήδηση σε: