快速查找二维数组的所有峰值,c语言实现最好,python也可以,最好能实现滤波。

Python09

快速查找二维数组的所有峰值,c语言实现最好,python也可以,最好能实现滤波。,第1张

#include<stdio.h>

#include <stdlib.h>

#include <limits.h>

#include<malloc.h>

#define maxsize 6 //每个波形数据最大采集个数  默认6

typedef struct array1

{

    int *data

    struct array1 *next

}ARR1

ARR1 *addNewArr(ARR1 *arrHead,ARR1 *arrTail)//插入一组波形数据节点 返回尾节点

int findMaxF(ARR1 *arrHead)//查找最大峰值

int removeMinF(ARR1 *arrHead)//移除最小峰值数据组   返回最小峰值

void printfArr(ARR1 *arrHead)//打印数据链表

int main()

{

    ARR1 *arrHead=(ARR1 *)malloc(sizeof(ARR1))

    arrHead->next=NULL

    ARR1 *arrTail=NULL

    arrTail=addNewArr(arrHead,arrTail)//想插入几组,就调用几次  我就测试6组

    arrTail=addNewArr(arrHead,arrTail)

    arrTail=addNewArr(arrHead,arrTail)

    arrTail=addNewArr(arrHead,arrTail)

    arrTail=addNewArr(arrHead,arrTail)

    arrTail=addNewArr(arrHead,arrTail)

    printf("采集的原数据组为:\n")

    printfArr(arrHead)

    printf("最大峰值:%d,最小峰值值:%d\n",findMaxF(arrHead),removeMinF(arrHead))

    printf("删除最小峰值数据组后的数据为:\n")

    printfArr(arrHead)

    return 0

}

void printfArr(ARR1 *arrHead)//打印数据链表

{

    while(arrHead->next!=NULL)

    {

        printf("%d,%d,%d,%d,%d,%d\n",arrHead->next->data[0],arrHead->next->data[1],arrHead->next->data[2],arrHead->next->data[3],arrHead->next->data[4],arrHead->next->data[5])

        arrHead=arrHead->next

    }

}

ARR1 *addNewArr(ARR1 *arrHead,ARR1 *arrTail)//插入一组波形数据   返回尾节点

{

    int *data=(int *)malloc(sizeof(int)*maxsize),i

    printf("采集一组波形数据(最大采集个数%d):",maxsize)

    for(i=0i<maxsizei++)

        scanf("%d",&data[i])

    ARR1 *arrNew=(ARR1 *)malloc(sizeof(ARR1))

    arrNew->data=data

    arrNew->next=NULL

    if(arrHead->next==NULL)//插入第一组数组 作为首节点

        arrHead->next=arrNew

    else

        arrTail->next=arrNew

    arrTail=arrNew

    return arrTail

}

int findMaxF(ARR1 *arrHead)//查找最大峰值

{

    int i,maxNum=0,maxf=0

    while(arrHead->next!=NULL)

    {

        maxNum=0

        for(i=0i<maxsizei++)//获取每组数据的峰值

        {

            if(arrHead->next->data[i]>maxNum)

                maxNum=arrHead->next->data[i]

        }

        if(maxNum>maxf)//获取最大峰值

            maxf=maxNum

        arrHead=arrHead->next

    }

    return maxf

}

int removeMinF(ARR1 *arrHead)//移除最小峰值数据组   返回最小峰值

{

    int i,maxNum=0,minf=INT_MAX

    ARR1 *minDataSave=NULL,*arrHeadSave=arrHead

    while(arrHead->next!=NULL)

    {

        maxNum=0

        for(i=0i<maxsizei++)//获取每组数据的峰值

        {

            if(arrHead->next->data[i]>maxNum)

                maxNum=arrHead->next->data[i]

        }

        if(maxNum<minf)//获取最小峰值

        {

            minDataSave=arrHead->next

            minf=maxNum

        }

        arrHead=arrHead->next

    }

    arrHead=arrHeadSave

    //移除最小峰值数据组

    while(arrHead->next!=NULL)

    {

        if(arrHead->next==minDataSave)//删除节点重组链表

        {

            arrHead->next=minDataSave->next

            minDataSave->next=NULL

            free(minDataSave->data)//释放节点内存

            free(minDataSave)

            break

        }

        arrHead=arrHead->next

    }

    return minf

}

输出 y = H* sin( 2*pi*f*t + 45.0/180.0*pi) 的信号即可。

下面程序产生 360个点。

#include <stdio.h>

#include <math.h>

int main () {

double f=160.0

double h=45.0,om

double phase=45.0//degrees

double pi

double t,dt

double s[360] //存放生成的信号

int i

pi = 4.0*atan(1.0) //圆周率

om = 2.0*pi*f //圆频率

phase = 45.0/180.0*pi //相位

printf("pi=%f om=%f phase=%f\n",pi,om,phase)

dt = 0.00002 //时间步长

for (i=0i<360i++) s[i]= h * sin(om * dt * i + phase)

for (i=0i<360i++) {printf("%8.3f ",s[i])if (i%5==0) printf("\n")}

return 0

}