Προς το περιεχόμενο

SOS σε εργασια στο matlab.


Tablet

Προτεινόμενες αναρτήσεις

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

Σε 3 πραγματα.

 

1)Θελω να δημιουργησω μουσικο κομματι εχοντας μια συναρτηση tone.m  για τις μουσικες νοτες(μου δινεται παρτιτουρα) και μια adsr για να εφαρμοσω την περιβαλλουσα.

2)Εχω να δημιουρφησω ενα ψηφιακο υψηπερατο φίλτρο με συχνοτητα αποκοπης 500 Hz

και να φιλτράρω το παραπάνω μουσικό κομματι.

3)Θελω να εμφανισω την αποκριση συχνότητας του φίλτρου καθως και την γραφική παράσταση στο πεδιο συχνότητας του παραπανω κομματιου πριν και μετα το φιλτράρισμα.

 

Τα φωτα σας αν εχετε την καλοσύνη..Χανω το μαθημα...... :(

Gaping the mind..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για check this out

 

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

 

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

Ο Αριστοτέλης γίνεται κτήμα του Γερμανού που τον μελετά, όχι του Έλληνα που τον αγνοεί

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderator

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

 

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

 

3. Το πρώτο γίνεται αν ξέρεις το φίλτρο, το δεύτερο θα χρειαστείς τους FFT του κομματιού και του επεξεργασμένου.

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Σε 3 πραγματα.

 

1)Θελω να δημιουργησω μουσικο κομματι εχοντας μια συναρτηση tone.m  για τις μουσικες νοτες(μου δινεται παρτιτουρα) και μια adsr για να εφαρμοσω την περιβαλλουσα.

2)Εχω να δημιουρφησω ενα ψηφιακο υψηπερατο φίλτρο με συχνοτητα αποκοπης 500 Hz

και να φιλτράρω το παραπάνω μουσικό κομματι.

 

Με ενδιαφέρει και εμένα το θέμα αυτό , γι αυτό αν είναι ευκολο δώσε τις συναρτήσεις στο function σου , να δω αν μπορω να σε βοηθήσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

φίλε μου, θεωρητικά μπορώ να σε βοηθήσω και στα 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)

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βρήκα κάτι που είχα φτιάξει, είναι σε 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.f9dddc766f6b66db8d6f95916597dcfb.GIF

phase_response.GIF.0c306ac5ac1a84b9c6c7fa692e6160fd.GIF

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

:)

 

Έριξα μια ματιά στα αρχεία που ανέβασες, ανοίγουν και με απλό 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 θα καθορίζουν την συχνότητα αποκοπής του φίλτρου και ΘΑ ΠΡΕΠΕΙ ΝΑ ΔΙΑΒΑΣΕΙΣ ΣΧΕΤΙΚΑ ώστε να δεις πώς προκύπτουν. Είναι το άλφα και το ωμέγα του μαθήματος. Και να θυμόμουν πώς βγαίνουν  ;D δεν θα σου'λεγα...

 

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

 

 

Δεν νομίζω να μπορώ να σε βοηθήσω περισσότερο. Καλή επιτυχία.

btw, στο doc αρχείο έλεγε ότι η προθεσμία ήταν αρχές γενάρη... ελπίζω να μην ισχύει

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργήστε λογαριασμό

Γραφτείτε στην παρέα μας. Είναι εύκολο!

Δημιουργία λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Σύνδεση
×
×
  • Δημοσιεύστε κάτι...

Τα cookies

Τοποθετήθηκαν cookies στην συσκευή σας για να είναι πιο εύκολη η περιήγηση στην σελίδα. Μπορείτε να τα ρυθμίσετε, διαφορετικά θεωρούμε πως είναι OK να συνεχίσετε. Πολιτική απορρήτου