discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Are there firls and kaiser filter methods for C++ OOT?


From: Marcin Puchlik
Subject: Re: Are there firls and kaiser filter methods for C++ OOT?
Date: Wed, 23 Feb 2022 23:03:22 +0100

Hi George,
You are welcome. 
Q1. If I write a line of code to extract the remez taps, say:
   lpfilter = 
gr::filter::pm_remez(int order,
const std::vector< double > & bands,
const std::vector< double > & ampl,
const std::vector< double > & error_weight,
const std::string filter_type = "bandpass",
int grid_density = 16 
)

The pm_remez has a squidly line under it and if I hover it with the mouse, it says gr::filter has no member function pm_remez. (I tried a bunch of different variations of things, but the squidly line remains.)

Marcin: Have you included the appropriate header file in your code? You should declare: #include <gnuradio/filter/pm_remez.h>

Q2. The doc write up states that the pm_remez filter_types are  one of: bandpass, hilbert or differentiator. It seems like a natural for all these filters to provide a lowpass option, what do you think? If I can get rid of the squidly line, I would be able to test if "lowpass" works. 

Marcin: I think that this depends on what you want to achieve. I cannot help here because of the lack of exact knowledge about that, sorry. 

Marcin

śr., 23 lut 2022 o 19:31 George Edwards <gedwards.eng@gmail.com> napisał(a):
Hi Marcin,

Thank you very much! I found my error, I forgot the "gain" which is the first parameter to the filter. The first parameter I wrote in the filter method was the "sample_rate" (which was a large number), hence the filter function could not converge. It is all good now, thank you.

I have two questions related to the remez filter (you may or maynot be able to give me an answer(s)):
Q1. If I write a line of code to extract the remez taps, say:
   lpfilter = 
gr::filter::pm_remez(int order,
const std::vector< double > & bands,
const std::vector< double > & ampl,
const std::vector< double > & error_weight,
const std::string filter_type = "bandpass",
int grid_density = 16 
)

The pm_remez has a squidly line under it and if I hover it with the mouse, it says gr::filter has no member function pm_remez. (I tried a bunch of different variations of things, but the squidly line remains.)

Q2. The doc write up states that the pm_remez filter_types are  one of: bandpass, hilbert or differentiator. It seems like a natural for all these filters to provide a lowpass option, what do you think? If I can get rid of the squidly line, I would be able to test if "lowpass" works. 

Thanks again for all your help.

Regards,
George

On Wed, Feb 23, 2022 at 2:02 AM Marcin Puchlik <m.puchlik@is-wireless.com> wrote:
George,
Running the below code:

#include <iostream>
#include <gnuradio/filter/firdes.h>

using namespace std;

int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
std::vector<float> taps = gr::filter::firdes::low_pass(1, 1, 0.3, 0.1);
for(int i = 0; i < taps.size(); i++)
cout << "tap " << i << ":" << "\t" << taps[i] << "\n";
return 0;
}


I get the output:

!!!Hello World!!!
tap 0: -0.00124749
tap 1: 0.0026334
tap 2: -3.313e-18
tap 3: -0.00722382
tap 4: 0.00725102
tap 5: 0.0112526
tap 6: -0.0272494
tap 7: 1.54168e-17
tap 8: 0.0582835
tap 9: -0.0539706
tap 10: -0.0877955
tap 11: 0.298026
tap 12: 0.600081
tap 13: 0.298026
tap 14: -0.0877955
tap 15: -0.0539706
tap 16: 0.0582835
tap 17: 1.54168e-17
tap 18: -0.0272494
tap 19: 0.0112526
tap 20: 0.00725102
tap 21: -0.00722382
tap 22: -3.313e-18
tap 23: 0.0026334
tap 24: -0.00124749




śr., 23 lut 2022 o 02:39 George Edwards <gedwards.eng@gmail.com> napisał(a):
Hi Marcin and Vasil,

Thank you guys very much!

Marcin: I did as you suggested and left out win_type and beta. 
Vasil: Based on the conversation exchanges between you Marcin, I followed your suggestion to link in the gnuradio-filter library - in lib/CMakeLists.txt in target_link_libraries() by adding gnuradio-filter.
Thus, the target_link_libraries in the original OOT lib/CMakeLists.txt file was:
target_link_libraries(gnuradio-ge_filters gnuradio::gnuradio-runtime)
and I added to it as shown below:
target_link_libraries(gnuradio-ge_filters gnuradio::gnuradio-runtime gnuradio-filter)
The OOT program compiles and makes the intended Gnuradio block for me to load in a GRC flowgraph. For experimental purposes, I made the OOT block to output the filter coefficients. When I run the grc, the lowpass filter outputs all zeros, so something is wrong! 
Marcin: You had written a piece of code to print "Hello World". Please run your code to print out the returned filter coefficients and let me know if it works well because mine is having some problems. 

This is how I invoked the filter method (all parameters are defined):
vector <float> lpfilter;     //vector variable will contain the filter coeff's
lpfilter = gr::filter::firdes::low_pass(gain, sampling_freq, cutoff_freq, transition_bandwidth);

Thank you guys!

George


On Tue, Feb 22, 2022 at 3:41 PM Marcin Puchlik <m.puchlik@is-wireless.com> wrote:
Geroge,
I posted the working code a few messages ago. Try to check this out. BTW as far as I can see those two arguments are optional (window type and beta). Try to run your code without them and check if it works.


wt., 22 lut 2022 o 19:25 George Edwards <gedwards.eng@gmail.com> napisał(a):
Hello Vasil and Marcin,

Thanks very much for your help.

I have all the relevant #include header files and invoke the low_pass filter as follows:
lpfilter = gr::filter::firdes::low_pass(gain, sampling_freq, cutoff_freq, transition_bandwidth,
fft::window::win_type::WIN_HAMMING, beta);

Observations:
Using the mouse to hover over WIN_HAMMING, I can see that it interprets the win_type enum variable and correctly assigns it a value of "0" (which is the value stated in the Gnuradio C++ API Reference manual). However, there is a squidly under beta. Hovering over beta, the error message is: 
Argument of type "double" is incompatible with parameter of type "gr::fft::window::win_type" 

If one of you has a working code fragment using one of the C++ Gnuradio filter methods that you can cut, paste and send in your next email I would appreciate it. 

Thanks for your help.

George

On Tue, Feb 22, 2022 at 6:15 AM Vasil Velichkov <vvvelichkov@gmail.com> wrote:
Hi George,

On 21/02/2022 18.31, George Edwards wrote:
> lpfilter = gr::filter::firdes::low_pass(gain, sampling_freq, cutoff_freq, transition_bandwidth,
> fft::window::win_type <https://www.gnuradio.org/doc/doxygen/classgr_1_1fft_1_1window.html#a599d7e9625d6cc77203a8b877c4911e2>window = fft::window::win_type::WIN_HAMMING, beta = 6.76);
>
> This failed and showed a squidly across the line with fft::window::win_type....!

Try adding "gr::" before "fft::window" and make sure gnuradio/fft/window.h is included.

  #include <gnuradio/fft/window.h>

  lpfilter = gr::filter::firdes::low_pass(gain, sampling_freq, cutoff_freq, transition_bandwidth,
        gr::fft::window::win_type window = fft::window::win_type::WIN_HAMMING, beta = 6.76);

If this does not fix it then provide the exact error you are getting.

Regards,
Vasil

reply via email to

[Prev in Thread] Current Thread [Next in Thread]