Added frequency shit for complex filters
This commit is contained in:
parent
c42589df3c
commit
08d6b4f683
|
@ -28,6 +28,7 @@ name = "firls-rs"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"nalgebra",
|
||||
"num",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -67,6 +68,31 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.3"
|
||||
|
@ -86,6 +112,17 @@ dependencies = [
|
|||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.43"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.1"
|
||||
|
@ -93,6 +130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-bigint",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
|
|
@ -7,3 +7,4 @@ edition = "2021"
|
|||
|
||||
[dependencies]
|
||||
nalgebra = "0.32.2"
|
||||
num = "0.4.0"
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
use firls_rs::{firls, frequency_shift_coeffs};
|
||||
|
||||
fn main() {
|
||||
let coeffs = firls(
|
||||
23,
|
||||
8000.0,
|
||||
&vec![(0.0, 1.0), (1200.0, 1.0), (1500.0, 0.0), (4000.0, 0.0)],
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let shifted = frequency_shift_coeffs(&coeffs, 8000.0, 1500.0);
|
||||
|
||||
println!("[");
|
||||
for coeff in shifted.iter() {
|
||||
println!("{} + {}j,", coeff.re, coeff.im);
|
||||
}
|
||||
println!("]");
|
||||
|
||||
println!("Lenght: {}", coeffs.len());
|
||||
}
|
16
src/lib.rs
16
src/lib.rs
|
@ -1,6 +1,5 @@
|
|||
use std::println;
|
||||
|
||||
use nalgebra::base::{DMatrix, DVector};
|
||||
use num::complex::Complex;
|
||||
|
||||
pub fn firls(lenght: usize, f_samp: f32, points: &Vec<(f32, f32)>) -> Result<Vec<f32>, &str> {
|
||||
if lenght % 2 != 1 {
|
||||
|
@ -26,6 +25,19 @@ pub fn firls(lenght: usize, f_samp: f32, points: &Vec<(f32, f32)>) -> Result<Vec
|
|||
Result::Ok(coeffs)
|
||||
}
|
||||
|
||||
pub fn frequency_shift_coeffs(coeffs: &Vec<f32>, f_samp: f32, f_center: f32) -> Vec<Complex<f32>> {
|
||||
let mut result = Vec::with_capacity(coeffs.len());
|
||||
|
||||
let f0 = f_center / f_samp;
|
||||
for i in 0..coeffs.len() {
|
||||
let shifted_coeff = coeffs[i]
|
||||
* (Complex::<f32>::new(0.0, 2.0) * std::f32::consts::PI * f0 * i as f32).exp();
|
||||
result.push(shifted_coeff);
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
fn generate_frequency_response(
|
||||
f_samp: f32,
|
||||
points: &Vec<(f32, f32)>,
|
||||
|
|
36
test.py
36
test.py
|
@ -9,18 +9,30 @@ def main():
|
|||
fs = 8000.0
|
||||
|
||||
coeffs = [
|
||||
-0.0047233836,
|
||||
0.04476544,
|
||||
-0.038443737,
|
||||
-0.0911246,
|
||||
0.2894902,
|
||||
0.6123418,
|
||||
0.2894902,
|
||||
-0.0911246,
|
||||
-0.038443737,
|
||||
0.04476544,
|
||||
-0.0047233836,
|
||||
]
|
||||
-0.016500179 + -0j,
|
||||
-0.008695895 + -0.020993747j,
|
||||
0.0020277721 + -0.0020277721j,
|
||||
-0.02584644 + -0.010705946j,
|
||||
0.00000000044103757 + -0.036984652j,
|
||||
0.0034438625 + -0.0014264944j,
|
||||
-0.0351775 + -0.0351775j,
|
||||
0.025973985 + -0.06270666j,
|
||||
0.0032853973 + 0.00000000007835594j,
|
||||
-0.051629633 + -0.12464481j,
|
||||
0.19602334 + -0.19602333j,
|
||||
0.31160092 + 0.12906952j,
|
||||
-0.000000009917405 + 0.27721885j,
|
||||
-0.12464481 + 0.051629633j,
|
||||
0.0023231243 + 0.002323129j,
|
||||
-0.025973985 + 0.06270666j,
|
||||
-0.049748495 + -0.0000000023729794j,
|
||||
0.001426496 + 0.0034438618j,
|
||||
-0.026152074 + 0.026152123j,
|
||||
-0.025846435 + -0.01070596j,
|
||||
-0.00000000017098507 + 0.0028677029j,
|
||||
-0.020993743 + 0.008695903j,
|
||||
-0.011667376 + -0.0116674j,
|
||||
]
|
||||
|
||||
freq_space = np.linspace(-fs/2 / (fs/2)*np.pi, fs/2 / (fs/2)*np.pi, 512)
|
||||
freqs, response = signal.freqz(coeffs, worN=freq_space)
|
||||
|
|
Loading…
Reference in New Issue