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

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!