"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