Real valued filters work
This commit is contained in:
parent
6c850d8883
commit
1aa3d6d6ed
|
@ -28,6 +28,8 @@ name = "firls-rs-macros"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"firls_rs",
|
"firls_rs",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
"syn 2.0.23",
|
"syn 2.0.23",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -160,9 +162,9 @@ checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.63"
|
version = "1.0.64"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
|
checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
|
@ -8,4 +8,6 @@ proc-macro = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
firls_rs = { path = "../firls-rs" }
|
firls_rs = { path = "../firls-rs" }
|
||||||
|
proc-macro2 = "1.0.64"
|
||||||
|
quote = "1.0.29"
|
||||||
syn = {version="2.0.23", features=["full"]}
|
syn = {version="2.0.23", features=["full"]}
|
||||||
|
|
|
@ -1,22 +1,17 @@
|
||||||
use firls_rs::firls;
|
|
||||||
use firls_rs_macros::firls_real;
|
use firls_rs_macros::firls_real;
|
||||||
|
|
||||||
firls_real!(13, 8000.0, 1);
|
const COEFFS: [f32; 13] = firls_real!(
|
||||||
//[(0.0, 1.0), (1900.0, 1.0), (3000.0, 0.0), (4000.0, 0.0)]);
|
13,
|
||||||
|
8000.0,
|
||||||
|
[(0.0, 1.0), (1900.0, 1.0), (3000.0, 0.0), (7000.0, 0.0)]
|
||||||
|
);
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let coeffs = firls(
|
|
||||||
13,
|
|
||||||
8000.0,
|
|
||||||
&vec![(0.0, 1.0), (1900.0, 1.0), (3000.0, 0.0), (4000.0, 0.0)],
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
println!("[");
|
println!("[");
|
||||||
for coeff in coeffs.iter() {
|
for coeff in COEFFS.iter() {
|
||||||
println!("{},", coeff)
|
println!("{},", coeff)
|
||||||
}
|
}
|
||||||
println!("]");
|
println!("]");
|
||||||
|
|
||||||
println!("Lenght: {}", coeffs.len());
|
println!("Lenght: {}", COEFFS.len());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,20 @@
|
||||||
extern crate proc_macro;
|
extern crate proc_macro;
|
||||||
|
extern crate quote;
|
||||||
|
|
||||||
|
use firls_rs::firls;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
use syn::parse::{Parse, ParseStream, Parser};
|
use proc_macro2::Span;
|
||||||
use syn::parse_macro_input;
|
use quote::quote;
|
||||||
|
use syn::parse::{Parse, ParseStream};
|
||||||
use syn::spanned::Spanned;
|
use syn::spanned::Spanned;
|
||||||
|
use syn::{parse_macro_input};
|
||||||
use syn::{punctuated::Punctuated, Expr, Lit, Token};
|
use syn::{punctuated::Punctuated, Expr, Lit, Token};
|
||||||
|
|
||||||
struct FirlsRealInput {
|
struct FirlsRealInput {
|
||||||
filter_len: usize,
|
filter_len: usize,
|
||||||
sample_frequency: f32,
|
sampling_frequency: f32,
|
||||||
|
bands: Vec<(f32, f32)>,
|
||||||
|
span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parse for FirlsRealInput {
|
impl Parse for FirlsRealInput {
|
||||||
|
@ -21,13 +28,11 @@ impl Parse for FirlsRealInput {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let filter_len = parse_filter_len(&arg_list[0])?;
|
|
||||||
let sample_frequency = parse_frequency(&arg_list[1])?;
|
|
||||||
let _bands = parse_band_list(&arg_list[2]);
|
|
||||||
|
|
||||||
Ok(FirlsRealInput {
|
Ok(FirlsRealInput {
|
||||||
filter_len,
|
filter_len: parse_filter_len(&arg_list[0])?,
|
||||||
sample_frequency,
|
sampling_frequency: parse_frequency(&arg_list[1])?,
|
||||||
|
bands: parse_band_list(&arg_list[2])?,
|
||||||
|
span: arg_list.span(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,14 +105,14 @@ fn parse_band_list(bands: &Expr) -> Result<Vec<(f32, f32)>, syn::Error> {
|
||||||
fn parse_band_tuple(tuple: &Expr) -> Result<(f32, f32), syn::Error> {
|
fn parse_band_tuple(tuple: &Expr) -> Result<(f32, f32), syn::Error> {
|
||||||
match tuple {
|
match tuple {
|
||||||
Expr::Tuple(tuple_expr) => {
|
Expr::Tuple(tuple_expr) => {
|
||||||
if tuple_expr.elems.len() != 2 {
|
if tuple_expr.elems.len() == 2 {
|
||||||
let freq = parse_frequency(&tuple_expr.elems[0])?;
|
let freq = parse_frequency(&tuple_expr.elems[0])?;
|
||||||
let gain = parse_gain(&tuple_expr.elems[1])?;
|
let gain = parse_gain(&tuple_expr.elems[1])?;
|
||||||
Ok((freq, gain))
|
Ok((freq, gain))
|
||||||
} else {
|
} else {
|
||||||
Err(syn::Error::new(
|
Err(syn::Error::new(
|
||||||
tuple.span(),
|
tuple.span(),
|
||||||
"band points should be a tuple expression",
|
"band points should be a two element tuple",
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,7 +125,23 @@ fn parse_band_tuple(tuple: &Expr) -> Result<(f32, f32), syn::Error> {
|
||||||
|
|
||||||
#[proc_macro]
|
#[proc_macro]
|
||||||
pub fn firls_real(input: TokenStream) -> TokenStream {
|
pub fn firls_real(input: TokenStream) -> TokenStream {
|
||||||
let input = parse_macro_input!(input as FirlsRealInput);
|
let FirlsRealInput {
|
||||||
|
filter_len,
|
||||||
|
sampling_frequency,
|
||||||
|
bands,
|
||||||
|
span,
|
||||||
|
} = parse_macro_input!(input as FirlsRealInput);
|
||||||
|
|
||||||
"fn answer() -> u32 { 42 }".parse().unwrap()
|
let output = match firls(filter_len, sampling_frequency, &bands) {
|
||||||
|
Ok(coeffs) => {
|
||||||
|
quote! {
|
||||||
|
[
|
||||||
|
#(#coeffs),*
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(msg) => syn::Error::new(span, msg).to_compile_error(),
|
||||||
|
};
|
||||||
|
|
||||||
|
proc_macro::TokenStream::from(output)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue