use Math::FFT my @samples; { local $/=\2048; # about 1/5 or 1/10 of a second at 11025 or 22050 sps # pick longer samples to be able to see lower frequencies binmode; @samples = <>; } # lets look at about 10 or 20 seconds in # should check if the sample exists in production code my $auft = Math::FFT->new([unpack 's*', $samples[100]]); my $power_spectrum = $auft->spctrm( [window => 'hamm'] ); my $dominant = (sort {$power_spectrum->[$a] <=> $power_spectrum->[$b]} 0..$#power_spectrum)[-1];