![{D9E46021-2619-40FA-9DE1-4443AA5381BC}](https://private-user-images.githubusercontent.com/138597868/404523120-59ca4dd6-ac0f-4ba2-9122-8d677fbf0caa.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5OTA1ODgsIm5iZiI6MTczOTk5MDI4OCwicGF0aCI6Ii8xMzg1OTc4NjgvNDA0NTIzMTIwLTU5Y2E0ZGQ2LWFjMGYtNGJhMi05MTIyLThkNjc3ZmJmMGNhYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOVQxODM4MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hNmY5MTA0NTIxOGM1NjFhZjNmZTI4YjkwOTJhZGU4Y2ZlODQyMjQzNDcyMjNhMGEzMmI5NjRmOTkyYWM1MGIxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.beoFH7V8S2dS3bdJ9zlAuiMlTy4Jxakg8vMDwnnbmcU)
![{6D8EA0E2-0DC4-409C-9B1F-61BAC0279448}](https://private-user-images.githubusercontent.com/138597868/404523131-2c3ff73b-5b6f-45d0-b382-a56a7b29fa26.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5OTA1ODgsIm5iZiI6MTczOTk5MDI4OCwicGF0aCI6Ii8xMzg1OTc4NjgvNDA0NTIzMTMxLTJjM2ZmNzNiLTViNmYtNDVkMC1iMzgyLWE1NmE3YjI5ZmEyNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOVQxODM4MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wM2VhYWRlNjg1MzBjZWVhMGFhMzIxZWI5MTc4OTcyM2YzMjI5ODlhZjJmMzc1NWQ5NjllZjE1YmJjYjdiODdjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.fIG6gvvtssjb3TeXQO-hIyog79FWJ1yGQPffDjhzwKk)
![{805D9E2F-63B6-4DE2-A8D9-5C30D86DBE5F}](https://private-user-images.githubusercontent.com/138597868/404523454-6c7f2207-34ad-4d33-aa5c-703123f7d184.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5OTA1ODgsIm5iZiI6MTczOTk5MDI4OCwicGF0aCI6Ii8xMzg1OTc4NjgvNDA0NTIzNDU0LTZjN2YyMjA3LTM0YWQtNGQzMy1hYTVjLTcwMzEyM2Y3ZDE4NC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOVQxODM4MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01YjNjNzczOWU1ZjIxZmNiY2Y5OGUwYWMwN2EzZDFmNzU3N2FlMDg5ZTE4ZmUxNDAyYjdjMjhkMmYwNDIxOTEyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.kq_ErDlFmTSvt9AyLP-HRZyL3xMZHhgPD8HDnUAevg0)
#ifndef SAMPLEFILTER_H_ #define SAMPLEFILTER_H_
/*
FIR filter designed with http://t-filter.appspot.com
sampling frequency: 100000000 Hz
-
0 Hz - 25000000 Hz gain = 1 desired ripple = 5 dB actual ripple = 4.05286559576885 dB
-
30000000 Hz - 50000000 Hz gain = 0 desired attenuation = -40 dB actual attenuation = -40.25040789635525 dB
*/
#define SAMPLEFILTER_TAP_NUM 21
typedef struct { double history[SAMPLEFILTER_TAP_NUM]; unsigned int last_index; } SampleFilter;
void SampleFilter_init(SampleFilter* f); void SampleFilter_put(SampleFilter* f, double input); double SampleFilter_get(SampleFilter* f);
#endif