package Audio::Filter; use base 'Audio::Data'; package Audio::Filter::FIR; use base 'Audio::Filter'; package Audio::Filter::AllPole; use base 'Audio::Filter'; package Audio::Resonator; use base 'Audio::Filter::AllPole'; sub new { my $class = shift; my $o = $class->SUPER::new(@_); $o->data(1.0,0.0,0.0,0.0,0.0); return $o; } sub setpole { my ($o,$f,$bw,$amp) = @_; my $minus_pi_t = - Audio::Data::PI() / $o->rate; my $two_pi_t = -2.0 * $minus_pi_t; my $r = exp($minus_pi_t * $bw); $c = -$r*$r; $b = $r * cos($two_pi_t * $f) * 2.0; $a = 1 - $b - $c; $a *= $amp if (@_ > 3); my @data = $o->data; splice(@data,0,3,$a,$b,$c); $o->data(@data); return $o; } package Audio::AntiResonator; use base 'Audio::Filter::FIR'; sub new { my $class = shift; my $o = $class->SUPER::new(@_); $o->data(1.0,0.0,0.0,0.0,0.0); return $o; } sub setzero { my ($o,$f,$bw,) = @_; $o->Audio::Resonator::setpole($f,$bw); my @data = $o->data; my $a = $data[0] = 1/$data[0]; my $b = $data[1] *= - $data[0]; my $c = $data[2] *= - $data[0]; $o->data(@data); return $o; } 1; __END__