"DC offset removal"



  • Wie gehts auf einem Audiosignal möglichst effizient?
    Ein einfacher Hochpass:

    out[s] = 0.5 * (out[s-1] + in[s] - in[s-1]);
    

    tuts, aber geht es schneller? 😕



  • viel schneller als 1x add + 1x sub + 1x shift wird's wohl nicht werden...



  • es sei denn das Signal liegt analog vor, dann tut's ein kleiner Kondensator 😃



  • AudioAmateur schrieb:

    Wie gehts auf einem Audiosignal möglichst effizient?
    Ein einfacher Hochpass:

    out[s] = 0.5 * (out[s-1] + in[s] - in[s-1]);
    

    tuts, aber geht es schneller?

    Ich denke nicht. Aber man kann sich natürlich Filter bauen, die andere (bessere?) Eigenschaften haben bzgl der Frequenzantwort. Dein Filter dämpft relativ viel von den niedrigen und mittleren Frequenzen. Bei einer Abtastrate von 44,1kHz (CD-Audio) wird 5000Hz um 6dB gedämpft, 1000Hz um 17dB, u.s.w.

    Mit Gnu Octave kann man sich relativ leicht andere Filter bauen:

    > [b,a] = butter(2,0.005,'high');  % Hochpass zweiter Ordnung
    > freqz(b,a);                      % Frequenzantwort plotten
    

    In C++ ließe sich das so verwenden:

    #include <iostream>
    
    /**
     * biquad filter (2nd order IIR)
     */
    struct biquad
    {
    	float b0, b1, b2, a1, a2; // filter parameters
    	float t1, t2;             // filter state
    
    	explicit biquad(float b0=1, float b1=0, float b2=0,
    			float a1=0, float a2=0)
    	: b0(b0),b1(b1),b2(b2),a1(a1),a2(a2),t1(0),t2(0) {}
    
    	void reset_state() { t1 = t2 = 0; }
    
    	float operator()(float in)
    	{
    		float t0 = in - a1*t1 - a2*t2;
    		float out = b0*t0 + b1*t1 + b2*t2;
    		t2 = t1; t1 = t0;
    		return out;
    	}
    };
    
    int main()
    {
    	biquad hpf (0.99,-1.98,0.99,-1.98,0.98);
    	// compute and print impulse response ...
    	for (int i=0; i<20; ++i) {
    		float y = hpf(i==0);
    		std::cout << y << '\n';
    	}
    	std::cout << "...\n";
    }
    

    ...läuft eigentlich auch sauschnell...

    kk


Log in to reply