Na, ratet mal schön! (ein neues, kleines Perl-Projekt)
Was soll das werden?
Kleiner Tipp: Es wird was richtig Nützliches, wenn was draus wird.Code
#!/usr/bin/perl
# ratet-mal.pl
use strict;
use warnings;
use Audio::Analyzer;
# Variablen
my $source = 'input.pcm';
my $analyzer = Audio::Analyzer->new(file => $source);
#useful information
my $freqs = $analyzer->freqs; #returns array reference
my @freqs = @$freqs;
# Programm
print "\nWieviele Frequenzbereiche von 0 Hz aufwärts sollen analysiert werden? (Anzahl + RETURN)\n";
my $first_n_freqs = <STDIN>;
chomp $first_n_freqs;
print "\nUm wieviel Prozent über dem Durchschnitt sollen die zu ermittelnden Frequenzen liegen? (Zahl ohne Prozentzeichen + RETURN)\n";
my $uppercent = <STDIN>;
chomp $uppercent;
while(defined(my $chunk = $analyzer->next)) {
my $done = $analyzer->progress;
print "Chunk ist nun: $chunk\n";
my $channels = $chunk->fft;
my $combined = $chunk->combine_fft($channels);
# print "\n", map {$_, "\n"} @$combined;
print "Anzahl Frequenzen: ", scalar @$freqs, "\n";
print "Anzahl FFT: ", scalar @$combined, "\n";
my $mean_fft = mean_fft($combined,$uppercent);
print "Durchschnittswert: $mean_fft\n";
my $freq_fft_ref = freq_fft($combined,$first_n_freqs);
my %freq_fft = %$freq_fft_ref;
print "Die Überdurchschnittswerte werden ermittelt!\n";
sleep 5;
my %freqs_overmean;
foreach (sort {$freq_fft{$a} <=> $freq_fft{$b}} keys %freq_fft) {
if ($freq_fft{$_} < $mean_fft) {next}
else {$freqs_overmean{$_}=$freq_fft{$_}};
}
my @first_fft;
foreach (sort {$a <=> $b} keys %freqs_overmean) {
push @first_fft, $_;
}
print map {$_, "\n"} @first_fft;
print "$done% completed\n";
sleep 3;
}
#######################################################################################
######################### Subroutinen ######################################
sub mean_fft {
my $combined_ref = shift;
my $uppercent = shift;
my @combined = @$combined_ref;
my $sum = 0;
map {$sum=$sum+$_} @combined;
my $mean_fft = $sum/(scalar @combined);
$mean_fft = $mean_fft*$uppercent/100;
return $mean_fft
}
sub freq_fft {
my $combined_ref = shift;
my $first_n_freqs = shift;
my @combined = @$combined_ref;
my %freq_fft;
for (my $i=0; $i < $first_n_freqs; $i++) {
if (not defined $freqs[$i]) {print "ERROR! freq-Wert"; sleep 11}
if (not defined $combined[$i]) {print "ERROR! combined-Wert"; sleep 11}
$freq_fft{$freqs[$i]} = $combined[$i];
}
return \%freq_fft
}
Output (Ausschnitt)
Wieviele Frequenzbereiche von 0 Hz aufwärts sollen analysiert werden? (Anzahl + RETURN)
77
Um wieviel Prozent über dem Durchschnitt sollen die zu ermittelnden Frequenzen liegen? (Zahl ohne Prozentzeichen + RETURN)
400
...
Chunk ist nun: Audio::Analyzer::Chunk=HASH(0x562afcb3fd68)
Anzahl Frequenzen: 1024
Anzahl FFT: 1024
Durchschnittswert: 0.031921348568446
Die Überdurchschnittswerte werden ermittelt!
86.1328125
107.666015625
150.732421875
172.265625
193.798828125
215.33203125
279.931640625
301.46484375
452.197265625
602.9296875
753.662109375
1421.19140625
1485.791015625
5% completed
Chunk ist nun: Audio::Analyzer::Chunk=HASH(0x562afcadf8c8)
Anzahl Frequenzen: 1024
Anzahl FFT: 1024
Durchschnittswert: 0.0554314209136372
Die Überdurchschnittswerte werden ermittelt!
86.1328125
129.19921875
150.732421875
172.265625
193.798828125
215.33203125
279.931640625
301.46484375
322.998046875
344.53125
495.263671875
990.52734375
6% completed
(Noch etwas unübersichtlich, und überhaupt ... äh, Output wird natürlich ganz anders ... wenn ...)
Links
Cave of Programming Statistics::Basic::Median - find the median of a list - metacpan.org Calculating statistical median SPECTRUM ANALYZER in Perl perl audio:analyzer working - Google-Suche [SOLVED] cannot install perl dependencies DynaLoader - Dynamically load C libraries into Perl code - metacpan.org Can't locate loadable object for module X in @INC (@INC contains: ... ) Math-FFT-1.34.tar.gz Math::FFT - Perl module to calculate Fast Fourier Transforms - metacpan.org How to change @INC to find Perl modules in non-standard locations Audio-Analyzer-0.22.tar.gz find › Wiki › ubuntuusers.de Perl › Wiki › ubuntuusers.de Audio::Analyzer - Makes using Math::FFT very easy for audio analysis - metacpan.org
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Where’s Erika? (@erikasirola) • Instagram-Fotos und -Videos
Kommentare
Kommentar veröffentlichen