Added frequency shit for complex filters

This commit is contained in:
Sebastian 2023-06-29 19:14:00 +02:00
parent c42589df3c
commit 08d6b4f683
6 changed files with 97 additions and 14 deletions

38
Cargo.lock generated
View File

@ -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",
]

View File

@ -7,3 +7,4 @@ edition = "2021"
[dependencies]
nalgebra = "0.32.2"
num = "0.4.0"

View File

@ -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());
}

View File

@ -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
View File

@ -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)