Ausgeraten!
Fertig geraten!
Hier die Lösung:
#!/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;
# Eichung der Frequenzen
# my $freqs_ref = freqs_justage(\@freqs);
# @freqs = @$freqs_ref;
# 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 "\nDie ersten $first_n_freqs Frequenz-Bereiche:\n\n";
for (my $z = 0; $z < $first_n_freqs + 1; $z++) {
print $freqs[$z], "\n";
}
print "\n";
print "\nUm wieviel Prozent über dem Durchschnitt sollen die zu ermittelnden Frequenzen liegen? (Zahl ohne Prozentzeichen + RETURN)\n";
my $uppercent = <STDIN>;
chomp $uppercent;
my %chunks;
my $chunk_no = 0;
while(defined(my $chunk = $analyzer->next)) {
$chunk_no++;
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, $_;
}
my %notes;
foreach (@first_fft) {
my $note = freq_2_note($_);
$notes{$note} = $_;
}
print map {$_, "\n"} sort {$a cmp $b} keys %notes;
print "Uniqued Notes\n";
my %notes_uniq;
foreach (@first_fft) {
my $note = freq_2_note($_);
$note =~ s/[0-9]//g;
if (not exists $notes_uniq{$note}) {$notes_uniq{$note} = 1}
else {$notes_uniq{$note} = $notes_uniq{$note} + 1}
}
print map {$_, " : ", $notes_uniq{$_}, "-mal vorhanden\n"} sort {$a cmp $b} keys %notes_uniq;
my $chunk_string = join(";", map {$_."x".$notes_uniq{$_}} sort {$a cmp $b} keys %notes_uniq);
$chunks{$chunk_no} = $chunk_string;
print "$done% completed\n";
# sleep 3;
}
# Ergebnis-Chunks
print "\nDie ermittelten Chunks sind:\n\n";
print map {$_, " : ", $chunks{$_}, "\n"} sort {$a <=> $b} keys %chunks;
print "\n";
#######################################################################################
######################### 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
}
sub freq_2_note {
my $freq = shift;
my %freqs2notes = ( "27.5" => "A0",
"29.1352" => "A#0/Bb0",
"30.8677" => "B0",
"32.7032" => "C1",
"34.6478" => "C#1/Db1",
"36.7081" => "D1",
"38.8909" => "D#1/Eb1",
"41.2034" => "E1",
"43.6535" => "F1",
"46.2493" => "F#1/Gb1",
"48.9994" => "G1",
"51.9131" => "G#1/Ab1",
"55" => "A1",
"58.2705" => "A#1/Bb1",
"61.7354" => "B1",
"65.4064" => "C2",
"69.2957" => "C#2/Db2",
"73.4162" => "D2",
"77.7817" => "D#2/Eb2",
"82.4069" => "E2",
"87.3071" => "F2",
"92.4986" => "F#2/Gb2",
"97.9989" => "G2",
"103.826" => "G#2/Ab2",
"110" => "A2",
"116.541" => "A#2/Bb2",
"123.471" => "B2",
"130.813" => "C3",
"138.591" => "C#3/Db3",
"146.832" => "D3",
"155.563" => "D#3/Eb3",
"164.814" => "E3",
"174.614" => "F3",
"184.997" => "F#3/Gb3",
"195.998" => "G3",
"207.652" => "G#3/Ab3",
"220" => "A3",
"233.082" => "A#3/Bb3",
"246.942" => "B3",
"261.626" => "C4",
"277.183" => "C#4/Db4",
"293.665" => "D4",
"311.127" => "D#4/Eb4",
"329.628" => "E4",
"349.228" => "F4",
"369.994" => "F#4/Gb4",
"391.995" => "G4",
"415.305" => "G#4/Ab4",
"440" => "A4",
"466.164" => "A#4/Bb4",
"493.883" => "B4",
"523.251" => "C5",
"554.365" => "C#5/Db5",
"587.33" => "D5",
"622.254" => "D#5/Eb5",
"659.255" => "E5",
"698.456" => "F5",
"739.989" => "F#5/Gb5",
"783.991" => "G5",
"830.609" => "G#5/Ab5",
"880" => "A5",
"932.328" => "A#5/Bb5",
"987.767" => "B5",
"1046.5" => "C6",
"1108.73" => "C#6/Db6",
"1174.66" => "D6",
"1244.51" => "D#6/Eb6",
"1318.51" => "E6",
"1396.91" => "F6",
"1479.98" => "F#6/Gb6",
"1567.98" => "G6",
"1661.22" => "G#6/Ab6",
"1760" => "A6",
"1864.66" => "A#6/Bb6",
"1975.53" => "B6",
"2093" => "C7",
"2217.46" => "C#7/Db7",
"2349.32" => "D7",
"2489.02" => "D#7/Eb7",
"2637.02" => "E7",
"2793.83" => "F7",
"2959.96" => "F#7/Gb7",
"3135.96" => "G7",
"3322.44" => "G#7/Ab7",
"3520" => "A7",
"3729.31" => "A#7/Bb7",
"3951.07" => "B7",
"4186.01" => "C8");
my $note;
foreach (keys %freqs2notes) {
my $freq_2_test = $_;
my $freq_under = $freq_2_test - $freq_2_test*3/100;
my $freq_above = $freq_2_test + $freq_2_test*3/100;
if ($freq_under < $freq && $freq_above > $freq) { $note = $freqs2notes{$freq_2_test} }
else { $note = "unbestimmt" }
}
return $note
}
sub freqs_justage {
my $freqs_ref = shift;
my @freqs = @$freqs_ref;
my @freqs_440 = (27.5,
29.1352,
30.8677,
32.7032,
34.6478,
36.7081,
38.8909,
41.2034,
43.6535,
46.2493,
48.9994,
51.9131,
55,
58.2705,
61.7354,
65.4064,
69.2957,
73.4162,
77.7817,
82.4069,
87.3071,
92.4986,
97.9989,
103.826,
110,
116.541,
123.471,
130.813,
138.591,
146.832,
155.563,
164.814,
174.614,
184.997,
195.998,
207.652,
220,
233.082,
246.942,
261.626,
277.183,
293.665,
311.127,
329.628,
349.228,
369.994,
391.995,
415.305,
440,
466.164,
493.883,
523.251,
554.365,
587.33,
622.254,
659.255,
698.456,
739.989,
783.991,
830.609,
880,
932.328,
987.767,
1046.5,
1108.73,
1174.66,
1244.51,
1318.51,
1396.91,
1479.98,
1567.98,
1661.22,
1760,
1864.66,
1975.53,
2093,
2217.46,
2349.32,
2489.02,
2637.02,
2793.83,
2959.96,
3135.96,
3322.44,
3520,
3729.31,
3951.07,
4186.01);
my @freqs_new = @freqs_440;
return \@freqs_new;
}
1 : unbestimmtx110
2 : Ax1;unbestimmtx109
3 : unbestimmtx110
4 : Ax1;unbestimmtx109
5 : unbestimmtx110
6 : A#/Bbx2;unbestimmtx108
7 : Bx1;Gx1;unbestimmtx108
8 : unbestimmtx110
9 : Ax1;unbestimmtx109
10 : C#/Dbx1;Dx1;unbestimmtx108
11 : unbestimmtx110
12 : Bx1;Fx1;unbestimmtx108
13 : A#/Bbx1;Bx1;unbestimmtx108
14 : unbestimmtx110
15 : C#/Dbx1;unbestimmtx109
16 : A#/Bbx1;Dx1;Gx1;unbestimmtx107
17 : A#/Bbx1;Ex1;unbestimmtx108
18 : unbestimmtx110
19 : Bx1;unbestimmtx109
20 : A#/Bbx1;Bx1;unbestimmtx108
21 : A#/Bbx1;unbestimmtx109
22 : Ax1;unbestimmtx109
23 : unbestimmtx110
24 : A#/Bbx1;C#/Dbx1;unbestimmtx108
25 : unbestimmtx110
26 : A#/Bbx1;unbestimmtx109
27 : A#/Bbx2;Ex1;unbestimmtx107
28 : unbestimmtx110
29 : unbestimmtx110
30 : Dx1;unbestimmtx109
31 : unbestimmtx110
32 : F#/Gbx1;unbestimmtx109
33 : unbestimmtx110
34 : C#/Dbx1;unbestimmtx109
35 : unbestimmtx110
36 : unbestimmtx110
37 : Fx1;G#/Abx1;unbestimmtx108
38 : Gx1;unbestimmtx109
39 : Ax1;unbestimmtx109
40 : A#/Bbx1;unbestimmtx109
41 : unbestimmtx110
42 : unbestimmtx110
43 : Cx1;D#/Ebx1;unbestimmtx108
44 : unbestimmtx110
45 : C#/Dbx1;unbestimmtx109
46 : A#/Bbx1;unbestimmtx109
47 : unbestimmtx110
48 : A#/Bbx1;unbestimmtx109
49 : A#/Bbx1;unbestimmtx109
50 : Ax1;A#/Bbx1;Bx1;Fx1;unbestimmtx106
51 : A#/Bbx1;Dx1;Fx1;Gx1;unbestimmtx106
52 : unbestimmtx110
53 : Fx1;unbestimmtx109
54 : A#/Bbx1;unbestimmtx109
55 : Ax1;unbestimmtx109
56 : unbestimmtx110
57 : unbestimmtx110
58 : Gx1;unbestimmtx109
59 : Ax1;unbestimmtx109
...
969 : G#/Abx1;unbestimmtx109
970 : F#/Gbx1;unbestimmtx109
971 : A#/Bbx1;Dx1;Ex1;unbestimmtx107
972 : D#/Ebx1;Fx1;unbestimmtx108
973 : Fx2;Gx1;unbestimmtx107
974 : Cx1;unbestimmtx109
975 : F#/Gbx1;unbestimmtx109
976 : unbestimmtx110
977 : Bx2;Gx1;unbestimmtx107
978 : unbestimmtx110
979 : unbestimmtx110
980 : Ax1;unbestimmtx109
981 : unbestimmtx110
982 : D#/Ebx1;Fx1;unbestimmtx108
983 : Bx1;C#/Dbx1;Gx1;unbestimmtx107
984 : unbestimmtx110
985 : Cx1;Fx1;unbestimmtx108
986 : Gx1;unbestimmtx109
987 : A#/Bbx1;unbestimmtx109
988 : Ex1;unbestimmtx109
989 : unbestimmtx110
990 : Ex1;unbestimmtx109
991 : A#/Bbx1;unbestimmtx109
992 : unbestimmtx110
993 : C#/Dbx1;Ex1;Fx1;Gx1;unbestimmtx106
994 : unbestimmtx110
995 : unbestimmtx110
996 : Ex1;unbestimmtx109
997 : A#/Bbx1;Cx1;G#/Abx1;unbestimmtx107
998 : unbestimmtx110
Ganz einfach. Ich habe angefangen zu basteln, bevor ich nachgeschlagen habe, was es mit dem FFT auf sich hat. Und milchbübchenrechnend habe ich einfach mal angenommen, dass die Frequenzen aus der Frequenzliste mit gewissen Toleranzen aus dem PCM-File "herausgemessen"/errechnet werden, damit dann eine grafische Darstellung mit Balken zu den Frequenzbereichen ... uso ... totaler Quatsch natürlich wieder mal!!! Typisch ich.
Aber davon abgesehen hat's trotzdem Spaß gemacht, mal wieder - nach langer Zeit - in Perl herumprobierzuprogrammieren.
FFT ist die Fourier-Transformation.
Fourier-Transformation, FFT - Wellenform, Sinusschwingung - HiFi-Lexikon
FFT
Wenn ich mich damit bekannter gemacht habe, versuche ich eventuell das Programm fertigzuentwickeln. Falls es das ist, was ich für meine Zwecke brauchen kann. Ach, so ... machen wollte ich das: Harmony-/Progressionsanalyse mit Akkord- & Taktangabe
Eigentlich kann's doch nicht so schwer sein, oder?
https://www.nti-audio.com/de/service/wissen/fast-fourier-transformation-fft
By Fourier1789 - Own work, CC BY-SA 4.0, Link
Harmonic analysis - Wikipedia
Materialforschung: Laserschweißen mit Keramik - Golem.de But what is the Fourier Transform? A visual introduction. - YouTube Intuitive Understanding of the Fourier Transform and FFTs - YouTube 17.11: Sound Visualization: Frequency Analysis with FFT - p5.js Sound Tutorial - YouTube Imager::Graph - Perl extension for producing Graphs using the Imager library. - metacpan.org
Perl Data Language
Audio::Data - module for representing audio data to perl - metacpan.org
Audio::Analyzer::ToneDetect - Detect freq of tones in an audio file or stream - metacpan.org
Imager::Graph - Perl extension for producing Graphs using the Imager library. - metacpan.org
Fourier Transform, Fourier Series, and frequency spectrum - YouTube
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Where’s Erika? (@erikasirola) • Instagram-Fotos und -Videos
Hier die Lösung:
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;
# Eichung der Frequenzen
# my $freqs_ref = freqs_justage(\@freqs);
# @freqs = @$freqs_ref;
# 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 "\nDie ersten $first_n_freqs Frequenz-Bereiche:\n\n";
for (my $z = 0; $z < $first_n_freqs + 1; $z++) {
print $freqs[$z], "\n";
}
print "\n";
print "\nUm wieviel Prozent über dem Durchschnitt sollen die zu ermittelnden Frequenzen liegen? (Zahl ohne Prozentzeichen + RETURN)\n";
my $uppercent = <STDIN>;
chomp $uppercent;
my %chunks;
my $chunk_no = 0;
while(defined(my $chunk = $analyzer->next)) {
$chunk_no++;
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, $_;
}
my %notes;
foreach (@first_fft) {
my $note = freq_2_note($_);
$notes{$note} = $_;
}
print map {$_, "\n"} sort {$a cmp $b} keys %notes;
print "Uniqued Notes\n";
my %notes_uniq;
foreach (@first_fft) {
my $note = freq_2_note($_);
$note =~ s/[0-9]//g;
if (not exists $notes_uniq{$note}) {$notes_uniq{$note} = 1}
else {$notes_uniq{$note} = $notes_uniq{$note} + 1}
}
print map {$_, " : ", $notes_uniq{$_}, "-mal vorhanden\n"} sort {$a cmp $b} keys %notes_uniq;
my $chunk_string = join(";", map {$_."x".$notes_uniq{$_}} sort {$a cmp $b} keys %notes_uniq);
$chunks{$chunk_no} = $chunk_string;
print "$done% completed\n";
# sleep 3;
}
# Ergebnis-Chunks
print "\nDie ermittelten Chunks sind:\n\n";
print map {$_, " : ", $chunks{$_}, "\n"} sort {$a <=> $b} keys %chunks;
print "\n";
#######################################################################################
######################### 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
}
sub freq_2_note {
my $freq = shift;
my %freqs2notes = ( "27.5" => "A0",
"29.1352" => "A#0/Bb0",
"30.8677" => "B0",
"32.7032" => "C1",
"34.6478" => "C#1/Db1",
"36.7081" => "D1",
"38.8909" => "D#1/Eb1",
"41.2034" => "E1",
"43.6535" => "F1",
"46.2493" => "F#1/Gb1",
"48.9994" => "G1",
"51.9131" => "G#1/Ab1",
"55" => "A1",
"58.2705" => "A#1/Bb1",
"61.7354" => "B1",
"65.4064" => "C2",
"69.2957" => "C#2/Db2",
"73.4162" => "D2",
"77.7817" => "D#2/Eb2",
"82.4069" => "E2",
"87.3071" => "F2",
"92.4986" => "F#2/Gb2",
"97.9989" => "G2",
"103.826" => "G#2/Ab2",
"110" => "A2",
"116.541" => "A#2/Bb2",
"123.471" => "B2",
"130.813" => "C3",
"138.591" => "C#3/Db3",
"146.832" => "D3",
"155.563" => "D#3/Eb3",
"164.814" => "E3",
"174.614" => "F3",
"184.997" => "F#3/Gb3",
"195.998" => "G3",
"207.652" => "G#3/Ab3",
"220" => "A3",
"233.082" => "A#3/Bb3",
"246.942" => "B3",
"261.626" => "C4",
"277.183" => "C#4/Db4",
"293.665" => "D4",
"311.127" => "D#4/Eb4",
"329.628" => "E4",
"349.228" => "F4",
"369.994" => "F#4/Gb4",
"391.995" => "G4",
"415.305" => "G#4/Ab4",
"440" => "A4",
"466.164" => "A#4/Bb4",
"493.883" => "B4",
"523.251" => "C5",
"554.365" => "C#5/Db5",
"587.33" => "D5",
"622.254" => "D#5/Eb5",
"659.255" => "E5",
"698.456" => "F5",
"739.989" => "F#5/Gb5",
"783.991" => "G5",
"830.609" => "G#5/Ab5",
"880" => "A5",
"932.328" => "A#5/Bb5",
"987.767" => "B5",
"1046.5" => "C6",
"1108.73" => "C#6/Db6",
"1174.66" => "D6",
"1244.51" => "D#6/Eb6",
"1318.51" => "E6",
"1396.91" => "F6",
"1479.98" => "F#6/Gb6",
"1567.98" => "G6",
"1661.22" => "G#6/Ab6",
"1760" => "A6",
"1864.66" => "A#6/Bb6",
"1975.53" => "B6",
"2093" => "C7",
"2217.46" => "C#7/Db7",
"2349.32" => "D7",
"2489.02" => "D#7/Eb7",
"2637.02" => "E7",
"2793.83" => "F7",
"2959.96" => "F#7/Gb7",
"3135.96" => "G7",
"3322.44" => "G#7/Ab7",
"3520" => "A7",
"3729.31" => "A#7/Bb7",
"3951.07" => "B7",
"4186.01" => "C8");
my $note;
foreach (keys %freqs2notes) {
my $freq_2_test = $_;
my $freq_under = $freq_2_test - $freq_2_test*3/100;
my $freq_above = $freq_2_test + $freq_2_test*3/100;
if ($freq_under < $freq && $freq_above > $freq) { $note = $freqs2notes{$freq_2_test} }
else { $note = "unbestimmt" }
}
return $note
}
sub freqs_justage {
my $freqs_ref = shift;
my @freqs = @$freqs_ref;
my @freqs_440 = (27.5,
29.1352,
30.8677,
32.7032,
34.6478,
36.7081,
38.8909,
41.2034,
43.6535,
46.2493,
48.9994,
51.9131,
55,
58.2705,
61.7354,
65.4064,
69.2957,
73.4162,
77.7817,
82.4069,
87.3071,
92.4986,
97.9989,
103.826,
110,
116.541,
123.471,
130.813,
138.591,
146.832,
155.563,
164.814,
174.614,
184.997,
195.998,
207.652,
220,
233.082,
246.942,
261.626,
277.183,
293.665,
311.127,
329.628,
349.228,
369.994,
391.995,
415.305,
440,
466.164,
493.883,
523.251,
554.365,
587.33,
622.254,
659.255,
698.456,
739.989,
783.991,
830.609,
880,
932.328,
987.767,
1046.5,
1108.73,
1174.66,
1244.51,
1318.51,
1396.91,
1479.98,
1567.98,
1661.22,
1760,
1864.66,
1975.53,
2093,
2217.46,
2349.32,
2489.02,
2637.02,
2793.83,
2959.96,
3135.96,
3322.44,
3520,
3729.31,
3951.07,
4186.01);
my @freqs_new = @freqs_440;
return \@freqs_new;
}
Output (Ausschnitt)
1 : unbestimmtx110
2 : Ax1;unbestimmtx109
3 : unbestimmtx110
4 : Ax1;unbestimmtx109
5 : unbestimmtx110
6 : A#/Bbx2;unbestimmtx108
7 : Bx1;Gx1;unbestimmtx108
8 : unbestimmtx110
9 : Ax1;unbestimmtx109
10 : C#/Dbx1;Dx1;unbestimmtx108
11 : unbestimmtx110
12 : Bx1;Fx1;unbestimmtx108
13 : A#/Bbx1;Bx1;unbestimmtx108
14 : unbestimmtx110
15 : C#/Dbx1;unbestimmtx109
16 : A#/Bbx1;Dx1;Gx1;unbestimmtx107
17 : A#/Bbx1;Ex1;unbestimmtx108
18 : unbestimmtx110
19 : Bx1;unbestimmtx109
20 : A#/Bbx1;Bx1;unbestimmtx108
21 : A#/Bbx1;unbestimmtx109
22 : Ax1;unbestimmtx109
23 : unbestimmtx110
24 : A#/Bbx1;C#/Dbx1;unbestimmtx108
25 : unbestimmtx110
26 : A#/Bbx1;unbestimmtx109
27 : A#/Bbx2;Ex1;unbestimmtx107
28 : unbestimmtx110
29 : unbestimmtx110
30 : Dx1;unbestimmtx109
31 : unbestimmtx110
32 : F#/Gbx1;unbestimmtx109
33 : unbestimmtx110
34 : C#/Dbx1;unbestimmtx109
35 : unbestimmtx110
36 : unbestimmtx110
37 : Fx1;G#/Abx1;unbestimmtx108
38 : Gx1;unbestimmtx109
39 : Ax1;unbestimmtx109
40 : A#/Bbx1;unbestimmtx109
41 : unbestimmtx110
42 : unbestimmtx110
43 : Cx1;D#/Ebx1;unbestimmtx108
44 : unbestimmtx110
45 : C#/Dbx1;unbestimmtx109
46 : A#/Bbx1;unbestimmtx109
47 : unbestimmtx110
48 : A#/Bbx1;unbestimmtx109
49 : A#/Bbx1;unbestimmtx109
50 : Ax1;A#/Bbx1;Bx1;Fx1;unbestimmtx106
51 : A#/Bbx1;Dx1;Fx1;Gx1;unbestimmtx106
52 : unbestimmtx110
53 : Fx1;unbestimmtx109
54 : A#/Bbx1;unbestimmtx109
55 : Ax1;unbestimmtx109
56 : unbestimmtx110
57 : unbestimmtx110
58 : Gx1;unbestimmtx109
59 : Ax1;unbestimmtx109
...
969 : G#/Abx1;unbestimmtx109
970 : F#/Gbx1;unbestimmtx109
971 : A#/Bbx1;Dx1;Ex1;unbestimmtx107
972 : D#/Ebx1;Fx1;unbestimmtx108
973 : Fx2;Gx1;unbestimmtx107
974 : Cx1;unbestimmtx109
975 : F#/Gbx1;unbestimmtx109
976 : unbestimmtx110
977 : Bx2;Gx1;unbestimmtx107
978 : unbestimmtx110
979 : unbestimmtx110
980 : Ax1;unbestimmtx109
981 : unbestimmtx110
982 : D#/Ebx1;Fx1;unbestimmtx108
983 : Bx1;C#/Dbx1;Gx1;unbestimmtx107
984 : unbestimmtx110
985 : Cx1;Fx1;unbestimmtx108
986 : Gx1;unbestimmtx109
987 : A#/Bbx1;unbestimmtx109
988 : Ex1;unbestimmtx109
989 : unbestimmtx110
990 : Ex1;unbestimmtx109
991 : A#/Bbx1;unbestimmtx109
992 : unbestimmtx110
993 : C#/Dbx1;Ex1;Fx1;Gx1;unbestimmtx106
994 : unbestimmtx110
995 : unbestimmtx110
996 : Ex1;unbestimmtx109
997 : A#/Bbx1;Cx1;G#/Abx1;unbestimmtx107
998 : unbestimmtx110
Lösung
Ganz einfach. Ich habe angefangen zu basteln, bevor ich nachgeschlagen habe, was es mit dem FFT auf sich hat. Und milchbübchenrechnend habe ich einfach mal angenommen, dass die Frequenzen aus der Frequenzliste mit gewissen Toleranzen aus dem PCM-File "herausgemessen"/errechnet werden, damit dann eine grafische Darstellung mit Balken zu den Frequenzbereichen ... uso ... totaler Quatsch natürlich wieder mal!!! Typisch ich.
Aber davon abgesehen hat's trotzdem Spaß gemacht, mal wieder - nach langer Zeit - in Perl herumprobierzuprogrammieren.
FFT ist die Fourier-Transformation.
Fourier-Transformation, FFT - Wellenform, Sinusschwingung - HiFi-Lexikon
FFT
Wenn ich mich damit bekannter gemacht habe, versuche ich eventuell das Programm fertigzuentwickeln. Falls es das ist, was ich für meine Zwecke brauchen kann. Ach, so ... machen wollte ich das: Harmony-/Progressionsanalyse mit Akkord- & Taktangabe
Eigentlich kann's doch nicht so schwer sein, oder?
Berechnungen mit FFT Resultaten
FFTs werden überwiegend zur Visualisierung von Signalen verwendet. Es gibt jedoch auch Anwendungen, bei denen FFT Resultate verrechnet werden. So können zum Beispiel sehr einfach Pegel von definierten Frequenzbändern errechnet werden, indem diese über einen RSS (Root Sum Square) Algorithmus addiert werden.
https://www.nti-audio.com/de/service/wissen/fast-fourier-transformation-fft
By Fourier1789 - Own work, CC BY-SA 4.0, Link
Harmonic analysis - Wikipedia
Materialforschung: Laserschweißen mit Keramik - Golem.de But what is the Fourier Transform? A visual introduction. - YouTube Intuitive Understanding of the Fourier Transform and FFTs - YouTube 17.11: Sound Visualization: Frequency Analysis with FFT - p5.js Sound Tutorial - YouTube Imager::Graph - Perl extension for producing Graphs using the Imager library. - metacpan.org
Perl Data Language
Audio::Data - module for representing audio data to perl - metacpan.org
Audio::Analyzer::ToneDetect - Detect freq of tones in an audio file or stream - metacpan.org
Imager::Graph - Perl extension for producing Graphs using the Imager library. - metacpan.org
Fourier Transform, Fourier Series, and frequency spectrum - YouTube
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Kommentare
Kommentar veröffentlichen