… | |
… | |
1500 | $beta = 2.5 unless defined $beta; |
1500 | $beta = 2.5 unless defined $beta; |
1501 | |
1501 | |
1502 | $size = $size->getdim(0) if ref $size; |
1502 | $size = $size->getdim(0) if ref $size; |
1503 | $size > 2 or barf "fft window size too small"; |
1503 | $size > 2 or barf "fft window size too small"; |
1504 | |
1504 | |
1505 | my $midn = $size >> 1; |
1505 | my $midn = $size >> 1; |
1506 | my $midm1 = ($size-1) >> 1; |
1506 | my $midm1 = ($size-1) >> 1; |
1507 | my $midp1 = ($size+1) >> 1; |
1507 | my $midp1 = ($size+1) >> 1; |
1508 | my $dur = zeroes $size; |
1508 | my $dur = zeroes $size; |
1509 | my $sf = ($size-1)/$size; |
1509 | my $sf = ($size-1)/$size; |
1510 | %fft_window = ( |
1510 | %fft_window = ( |
1511 | RECTANGULAR => sub { |
1511 | RECTANGULAR => sub { |
1512 | $dur->ones |
1512 | $dur->ones |
1513 | }, |
1513 | }, |
… | |
… | |
1671 | |
1671 | |
1672 | sub spectrum { |
1672 | sub spectrum { |
1673 | my ($data, $norm, $window, $beta) = @_; |
1673 | my ($data, $norm, $window, $beta) = @_; |
1674 | my $len; |
1674 | my $len; |
1675 | if (defined $window) { |
1675 | if (defined $window) { |
1676 | $window = gen_fft_window ($data->getdim(0), $window, $beta) unless ref $window; |
1676 | $window = gen_fft_window ($data->getdim (0), $window, $beta) unless ref $window; |
1677 | $data = $data * $window; |
1677 | $data = $data * $window; |
1678 | $len = $window->getdim(0); |
1678 | $len = $window->getdim (0); |
1679 | } else { |
1679 | } else { |
1680 | $len = $data->getdim(0); |
1680 | $len = $data->getdim (0); |
1681 | } |
1681 | } |
1682 | $data = rfft ($data->slice("0:".($len-1))->sever)->slice(",0:".int($len/2))->Cr2p->slice("(0)"); |
1682 | $data = rfft ( |
|
|
1683 | $data->slice ("0:" . ($len - 1)) |
|
|
1684 | ->sever |
|
|
1685 | ) |
|
|
1686 | ->slice (",0:" . int ($len / 2)) |
|
|
1687 | ->PDL::Complex::Cr2p |
|
|
1688 | ->slice ("(0)"); |
1683 | if ($norm == 1 || lc $norm eq "norm") { |
1689 | if ($norm == 1 || lc $norm eq "norm") { |
1684 | $data / max $data; |
1690 | $data / max $data; |
1685 | } elsif (($norm =~ /^[.0]+$/) || (lc $norm eq "db")) { |
1691 | } elsif (($norm =~ /^[.0]+$/) || (lc $norm eq "db")) { |
1686 | log (1e-37 + $data / max $data) * (20 / log 10); |
1692 | log (1e-37 + $data / max $data) * (20 / log 10); |
1687 | } else { |
1693 | } else { |