濾波c語言代碼,濾波器c語言實現

本文目錄一覽:

求:一個關於FIR帶通濾波器的C語言設計程序 代碼

short h[], short y[])

{

int i, j, sum; for (j = 0; j 100; j++) {

sum = 0;

for (i = 0; i 32; i++)

sum += x[i+j] * h[i];

y[j] = sum 15;

}

}

2

void fir(short x[], short h[], short y[])

{

int i, j, sum0, sum1;

short x0,x1,h0,h1; for (j = 0; j 100; j+=2) {

sum0 = 0;

sum1 = 0;

x0 = x[j];

for (i = 0; i 32; i+=2){

x1 = x[j+i+1];

h0 = h[i];

sum0 += x0 * h0;

sum1 += x1 * h0;

x0 = x[j+i+2];

h1 = h[i+1];

sum0 += x1 * h1;

sum1 += x0 * h1;

}

y[j] = sum0 15;

y[j+1] = sum1 15;

}

}

3

void fir(short x[], short h[], short y[])

{

int i, j, sum0, sum1;

short x0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7; for (j = 0; j 100; j+=2) {

sum0 = 0;

sum1 = 0;

x0 = x[j];

for (i = 0; i 32; i+=8){

x1 = x[j+i+1];

h0 = h[i];

sum0 += x0 * h0;

sum1 += x1 * h0;

x2 = x[j+i+2];

h1 = h[i+1];

sum0 += x1 * h1;

sum1 += x2 * h1;

x3 = x[j+i+3];

h2 = h[i+2];

sum0 += x2 * h2;

sum1 += x3 * h2;

x4 = x[j+i+4];

h3 = h[i+3];

sum0 += x3 * h3;

sum1 += x4 * h3;

x5 = x[j+i+5];

h4 = h[i+4];

sum0 += x4 * h4;

sum1 += x5 * h4;

x6 = x[j+i+6];

h5 = h[i+5];

sum0 += x5 * h5;

sum1 += x6 * h5;

x7 = x[j+i+7];

h6 = h[i+6];

sum0 += x6 * h6;

sum1 += x7 * h6;

x0 = x[j+i+8];

h7 = h[i+7];

sum0 += x7 * h7;

sum1 += x0 * h7;

}

y[j] = sum0 15;

y[j+1] = sum1 15;

}

}

一段matlab低通濾波器程序,求改編成C語言。

這個我剛好做過一個濾波器,事實上對時域信號做FFT,截取一定點數再做逆FFT相當於理想濾波。設計濾波器代碼如下:

f1=100;f2=200;%待濾波正弦信號頻率

fs=2000;%採樣頻率

m=(0.3*f1)/(fs/2);%定義過度帶寬

M=round(8/m);%定義窗函數的長度

N=M-1;%定義濾波器的階數

b=fir1(N,f2/fs);%使用fir1函數設計濾波器

%輸入的參數分別是濾波器的階數和截止頻率

figure(1)

[h,f]=freqz(b,1,512);%濾波器的幅頻特性圖

%[H,W]=freqz(B,A,N)當N是一個整數時函數返回N點的頻率向量和幅頻響應向量

plot(f*fs/(2*pi),20*log10(abs(h)))%參數分別是頻率與幅值

xlabel(‘頻率/赫茲’);ylabel(‘增益/分貝’);title(‘濾波器的增益響應’);

figure(2)

subplot(211)

t=0:1/fs:0.5;%定義時間範圍和步長

s=sin(2*pi*f1*t)+sin(2*pi*f2*t);%濾波前信號

plot(t,s);%濾波前的信號圖像

xlabel(‘時間/秒’);ylabel(‘幅度’);title(‘信號濾波前時域圖’);

subplot(212)

Fs=fft(s,512);%將信號變換到頻域

AFs=abs(Fs);%信號頻域圖的幅值

f=(0:255)*fs/512;%頻率採樣

plot(f,AFs(1:256));%濾波前的信號頻域圖

xlabel(‘頻率/赫茲’);ylabel(‘幅度’);title(‘信號濾波前頻域圖’);

figure(3)

sf=filter(b,1,s);%使用filter函數對信號進行濾波

%參數分別為濾波器系統函數的分子和分母多項式係數向量和待濾波信號輸入

subplot(211)

plot(t,sf)%濾波後的信號圖像

xlabel(‘時間/秒’);ylabel(‘幅度’);title(‘信號濾波後時域圖’);

axis([0.2 0.5 -2 2]);%限定圖像坐標範圍

subplot(212)

Fsf=fft(sf,512);%濾波後的信號頻域圖

AFsf=abs(Fsf);%信號頻域圖的幅值

f=(0:255)*fs/512;%頻率採樣

plot(f,AFsf(1:256))%濾波後的信號頻域圖

xlabel(‘頻率/赫茲’);ylabel(‘幅度’);title(‘信號濾波後頻域圖’);

二階濾波器用C語言怎麼寫

這個可比你想像的複雜多了,s是個復變量,1/(s+1)極點在-1,要想用C語言寫,必須理解清楚下面幾個問題:

1、輸入必須是個有限序列,比如(x+yi),x和y分別是兩個長度為N的數組

2、要過濾的頻率,必須是個整型值,或者是個整型區間

3、輸出結果同樣是兩個長度為N的數組(p+qi)

4、整個程序需要使用最基本的複數運算,這一點C語言本身不提供,必須手工寫複函數運算庫

5、實現的時候具體算法還需要編,這裡才是你問題的核心。

我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差別很大:

#include assert.h

#include math.h

#include stdio.h

#include stdlib.h

#include string.h

#include windows.h

#include “complex.h”

extern “C” {

// Discrete Fourier Transform (Basic Version, Without Any Enhancement)

// return – Without Special Meaning, constantly, zero

int DFT (long count, CComplex * input, CComplex * output)

{

assert(count);

assert(input);

assert(output);

CComplex F, X, T, W; int n, i;

long N = abs(count); long Inversing = count 0? 1: -1;

for(n = 0; n N ; n++){ // compute from line 0 to N-1

F = CComplex(0.0f, 0.0f); // clear a line

for(i = 0; i N; i++) {

T = input[i];

W = HarmonicPI2(Inversing * n * i, N);

X = T * W;

F += X; // fininshing a line

}//next i

// save data to outpus

memcpy(output + n, F, sizeof(F));

}//next n

return 0;

}//end DFT

int fft (long count, CComplex * input, CComplex * output)

{

assert(count);

assert(input);

assert(output);

int N = abs(count); long Inversing = count 0? -1: 1;

if (N % 2 || N 5) return DFT(count, input, output);

long N2 = N / 2;

CComplex * iEven = new CComplex[N2]; memset(iEven, 0, sizeof(CComplex) * N2);

CComplex * oEven = new CComplex[N2]; memset(oEven, 0, sizeof(CComplex) * N2);

CComplex * iOdd = new CComplex[N2]; memset(iOdd , 0, sizeof(CComplex) * N2);

CComplex * oOdd = new CComplex[N2]; memset(oOdd , 0, sizeof(CComplex) * N2);

int i = 0; CComplex W;

for(i = 0; i N2; i++) {

iEven[i] = input[i * 2];

iOdd [i] = input[i * 2 + 1];

}//next i

fft(N2 * Inversing, iEven, oEven);

fft(N2 * Inversing, iOdd, oOdd );

for(i = 0; i N2; i++) {

W = HarmonicPI2(Inversing * (- i), N);

output[i] = oEven[i] + W * oOdd[i];

output[i + N2] = oEven[i] – W * oOdd[i];

}//next i

return 0;

}//end FFT

void __stdcall FFT(

long N, // Serial Length, N 0 for DFT, N 0 for iDFT – inversed Discrete Fourier Transform

double * inputReal, double * inputImaginary, // inputs

double * AmplitudeFrequences, double * PhaseFrequences) // outputs

{

if (N == 0) return;

if (!inputReal !inputImaginary) return;

short n = abs(N);

CComplex * input = new CComplex[n]; memset(input, 0, sizeof(CComplex) * n);

CComplex * output= new CComplex[n]; memset(output,0, sizeof(CComplex) * n);

double rl = 0.0f, im = 0.0f; int i = 0;

for (i = 0; i n; i++) {

rl = 0.0f; im = 0.0f;

if (inputReal) rl = inputReal[i];

if (inputImaginary) im = inputImaginary[i];

input[i] = CComplex(rl, im);

}//next i

int f = fft(N, input, output);

double factor = n;

//factor = sqrt(factor);

if (N 0)

factor = 1.0f;

else

factor = 1.0f / factor;

//end if

for (i = 0; i n; i++) {

if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor;

if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor;

}//next i

delete [] output;

delete [] input;

return ;

}//end FFT

int __cdecl main(int argc, char * argv[])

{

fprintf(stderr, “%s usage:\n”, argv[0]);

fprintf(stderr, “Public Declare Sub FFT Lib \”wfft.exe\” \

(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \

ByRef freqAmplitude As Double, ByRef freqPhase As Double)”);

return 0;

}//end main

};//end extern “C”

c語言中值濾波問題?

1. 是規定做中值濾波的點不含邊緣的點(取決於中值濾波窗口大小)。 2,對圖像邊緣部分的信息進行鏡像處理。

如何用C語言實現低通濾波器

float middle_filter(float middle_value [] , intcount)

{

    float sample_value, data;

    int i, j;

    for (i=1; i for(j=count-1; j=i,–j){

        if(middle_value[j-1]=middle_value[j]{

            data=middle_value[j-1];

            middle_value[j-1]=middle_value[j]

            middle_value[j]=data;

        }

    }

    sample_value=middle_value(count-1)/2];

    return(sample_value);

}

幫幫忙,能不能給我 基於C語言的FIR濾波器設計的程序代碼(包括CMD,C,ASM),謝謝了 真的很急!!!

#include”math.h”

void firwin(n,band,fln,fhn,wn,h)

int n,band,wn;

double fln,fhn,h[];

{int i,n2,mid;

double s,pi,wc1,wc2,beta,delay;

double window();

beta=0.0;

if(wn==7)

{printf(“input beta parameter of Kaiser window(2beta10)\n”);

scanf(“%1f”,beta);

}

pi=4.0*atan(1.0);

if((n%2)==0)/*如果n是偶數*/

{n2=n/2+1;/*這行什麼意思*/

mid=1;

}

else

{n2=n/2;

mid=0;

}

delay=n/2.0;

wc1=2.0*pi*fln;

if(band=3) wc2=2.0*pi*fhn;/*先判斷用戶輸入的數據,如果band參數大於3*/

switch(band)

{case 1:

{for(i=0;i=n2;i++)

{s=i-delay;

h[i]=(sin(wc1*s)/(pi*s))*window(wn,n+1,i,beta);

h[n-i]=h[i];

}

if(mid==1) h[n/2]=wc1/pi;

break;

}

case 2:

{for(i=0;i=n2;i++)

{s=i-delay;

h[i]=(sin(pi*s)-sin(wc1*s))/(pi*s);

h[i]=h[i]*window(wn,n+1,i,beta);

h[n-i]=h[i];

}

if(mid==1) h[n/2]=1.0-wc1/pi;

break;

}

case 3:

{for(i=0;in2;i++)

{s=i-delay;

h[i]=(sin(wc2*s)-sin(wc1*s))/(pi*s);

h[i]=h[i]*window(wn,n+1,i,beta);

h[n-i]=h[i];

}

if(mid==1)h[n/2]=(wc2-wc1)/pi;

break;

}

case 4:

{for(i=0;i=n2;i++)

{s=i-delay;

h[i]=(sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s);

h[i]=h[i]*window(wn,n+1,i,beta);

h[n-i]=h[i];

}

if(mid==1)h[n/2]=(wc1+pi-wc2)/pi;

break;

}

}

}

static double window(type,n,i,beta)

int i,n,type;

double beta;

{int k;

double pi,w;

double kaiser();

pi=4.0*atan(1.0);

w=1.0;

switch(type)

{case 1:

{w=1.0;

break;

}

case 2:

{k=(n-2)/10;

if(i=k)

w=0.5*(1.0-cos(i*pi/(k+1)));

break;

}

case 3:

{w=1.0-fabs(1.0-2*i/(n-1.0));

break;

}

case 4:

{w=0.5*(1.0-cos(2*i*pi/(n-1)));

break;

}

case 5:

{w=0.54-0.46*cos(2*i*pi/(n-1));

break;

}

case 6:

{w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));

break;

}

case 7:

{w=kaiser(i,n,beta);

break;

}

}

return(w);

}

static double kaiser(i,n,beta)

int i,n;

double beta;

{

double a,w,a2,b1,b2,beta1;

double bessel0();

b1=bessel0(beta);

a=2.0*i/(double)(n-1)-1.0;

a2=a*a;

beta1=beta*sqrt(1.0-a2);

b2=bessel0(beta1);

w=b2/b1;

return(w);

}

static double bessel0(x)

double x;

{int i;

double d,y,d2,sum;

y=x/2.0;

d=1.0;

sum=1.0;

for(i=1;i=25;i++)

{d=d*y/i;

d2=d*d;

sum=sum+d2;

if(d2sum*(1.0e-8)) break;

}

return(sum);

}

這是窗函數法的,當然還有其他的比如切比雪夫,零相位濾波什麼的,我也在研究,不是很懂哈

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/159772.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:15
下一篇 2024-11-20 00:15

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29

發表回復

登錄後才能評論