相关文章推荐
千杯不醉的脆皮肠  ·  C# ...·  2 月前    · 
踏实的水煮鱼  ·  js ...·  6 月前    · 
卖萌的眼镜  ·  Maven用法整理 - 简书·  8 月前    · 
傻傻的生姜  ·  WinForm ...·  1 年前    · 


// 转换私钥编码格式

BOOL ConvertKeyFormat(char *oldKey,int oldKeyLen,int oldFormat,
char *newKeyFile,int newFormat)
{
EVP_PKEY *key=NULL;
BIO *biout=NULL;
int ret;

if ((biout=BIO_new_file(newKeyFile, "w")) == NULL)
return false;

key=LoadKey(oldKey,oldKeyLen,NULL,oldFormat);
if(key)
{
if(newFormat==FORMAT_DER)
ret=i2d_PrivateKey_bio(biout,key);
if(newFormat==FORMAT_PEM)
ret=PEM_write_bio_PrivateKey(biout, key, NULL, NULL, 0, 0, NULL);
}
else
return false;

BIO_free(biout);
EVP_PKEY_free(key);
return true;
}

/
// 根据公私钥生成P12格式证书

BOOL CreateP12Cert(char *pubCertFile,char *priCertFile,int oldFormat,
char *p12CertFile,char *p12pass)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
PKCS12 *p12;

cert=LoadCert(pubCertFile,0,NULL,oldFormat);
key=LoadKey(priCertFile,0,NULL,oldFormat);

SSLeay_add_all_algorithms();
p12=PKCS12_create(p12pass,"(SecPass)", key, cert, NULL, 0,0,0,0,0);
if(!p12)
{
X509_free(cert);
EVP_PKEY_free(key);
return false;
}

FILE * fp=fopen(p12CertFile, "wb");
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);

X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();
return true;
}

/
// 解析P12格式证书为公钥和私钥

BOOL PraseP12Cert(char *p12Cert,char *p12pass,
char *pubCertFile,char *priCertFile,int format)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
STACK_OF(X509) *ca = NULL;
BIO * bio=NULL,*bioCert=NULL,*bioKey=NULL;
PKCS12 *p12=NULL;
int i,j;

SSLeay_add_all_algorithms();
bio=BIO_new_file(p12Cert, "r");
p12 = d2i_PKCS12_bio(bio, NULL);
if (!PKCS12_parse(p12,p12pass, &key, &cert, &ca))
{
BIO_free(bio);
return false;
}
PKCS12_free(p12);

bioCert=BIO_new_file(pubCertFile, "w");
bioKey=BIO_new_file(priCertFile, "w");

if(format==FORMAT_PEM)
{
i=PEM_write_bio_X509(bioCert,cert);
j=PEM_write_bio_PrivateKey(bioKey, key, NULL, NULL, 0, 0, NULL);
}
if(format==FORMAT_DER)
{
i=i2d_X509_bio(bioCert,cert);
j=i2d_PrivateKey_bio(bioKey,key);
}

BIO_free(bio);
BIO_free(bioCert);
BIO_free(bioKey);
X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();
return true;
}

/
// 解析P12证书文件,结果存储在字符串对象中(PEM编码)

BOOL PraseP12CertToMem_PEM(char *p12Cert,char *p12pass,
CString *pubCert,CString *priCert)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
STACK_OF(X509) *ca = NULL;
BIO * bio=NULL,*bioCert=NULL,*bioKey=NULL;
PKCS12 *p12=NULL;
BUF_MEM *bptr;

SSLeay_add_all_algorithms();
bio=BIO_new_file(p12Cert, "r");
p12 = d2i_PKCS12_bio(bio, NULL);
PKCS12_parse(p12,p12pass, &key, &cert, &ca);
PKCS12_free(p12);

bioKey=BIO_new(BIO_s_mem());
BIO_set_close(bioKey, BIO_CLOSE);
bioCert=BIO_new(BIO_s_mem());
BIO_set_close(bioCert, BIO_CLOSE);

char buf[4096];

PEM_write_bio_X509(bioCert,cert);
BIO_get_mem_ptr(bioCert, &bptr);
memset(buf,0,4096);
memcpy(buf,bptr->da ta,bptr->length);
*pubCert=buf;

PEM_write_bio_PrivateKey(bioKey, key, NULL, NULL, 0, 0, NULL);
BIO_get_mem_ptr(bioKey, &bptr);
memset(buf,0,4096);
memcpy(buf,bptr->da ta,bptr->length);
*priCert=buf;

BIO_free(bioCert);
BIO_free(bioKey);
X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();
return true;
}

/
// 更改P12格式证书的密码

BOOL ChangeP12CertPassword(char *oldP12Cert,char *oldPass,
char *newP12Cert,char *newPass)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
STACK_OF(X509) *ca = NULL;
BIO * bio=NULL;
PKCS12 *p12=NULL;

SSLeay_add_all_algorithms();
bio=BIO_new_file(oldP12Cert, "r");
p12 = d2i_PKCS12_bio(bio, NULL);
if (!PKCS12_parse(p12,oldPass, &key, &cert, &ca))
{
BIO_free(bio);
return false;
}
PKCS12_free(p12);

p12=PKCS12_create(newPass,"(SecPass)", key, cert, NULL, 0,0,0,0,0);
if(!p12)
{
X509_free(cert);
EVP_PKEY_free(key);
return false;
}

FILE * fp=fopen(newP12Cert, "wb");
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);

X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();
return true;
}

/
// 根据证书请求文件签发证书

BOOL CreateCertFromRequestFil e(char *rootPubCert,int rootPubCertLength,
char *rootPriCert,int rootPriCertLength,
int rootCertFormat,int serialNumber,
int days,char *requestFile,
char *pubCert,char *priCert, int format)
{
X509 * rootCert=NULL;
EVP_PKEY * rootKey=NULL;
int i,j;
BOOL ret;

OpenSSL_add_all_digests();

rootKey=LoadKey(rootPriCert,rootPriCertLength,NULL,rootCertFormat);
rootCert=LoadCert(rootPubCert,rootPubCertLength,NULL,rootCertFormat);

if(rootKey==NULL||rootCert==NULL)
return false;

X509 * userCert=NULL;
EVP_PKEY * userKey=NULL;
X509_REQ *req=NULL;
BIO *in;
in=BIO_new_file(requestFile, "r");
req=PEM_read_bio_X509_REQ(in,NULL,NULL,NULL);
BIO_free(in);

userKey=X509_REQ_get_pubkey(req);
userCert=X509_new();

X509_set_version(userCert,2);
ASN1_INTEGER_set(X509_get_serialNumber(userCert),serialNumber);
X509_gmtime_adj(X509_get_notBefore(userCert),0);
X509_gmtime_adj(X509_get_notAfter(userCert),(long)60*60*24*days);
X509_set_pubkey(userCert,userKey);
EVP_PKEY_free(userKey);

X509_set_subject_name(userCert,req->req_info->subject);

X509_set_issuer_name(userCert,X509_get_issuer_name(rootCert));
X509_sign(userCert,rootKey,EVP_sha1());

BIO * bcert=NULL,* bkey=NULL;
if(((bcert=BIO_new_file(pubCert, "w"))== NULL)||
((bkey=BIO_new_file(priCert, "w")) == NULL))
return false;

if (format==FORMAT_DER)
{
ret=true;
i=i2d_X509_bio(bcert,userCert);
j=i2d_PrivateKey_bio(bkey,userKey);
}
else if(format==FORMAT_PEM)
{
ret=true;
i=PEM_write_bio_X509(bcert,userCert);
j=PEM_write_bio_PrivateKey(bkey,userKey,NULL,NULL,0,NULL, NULL);
}
if(!i||!j)
ret=false;

BIO_free(bcert);
BIO_free(bkey);
X509_free(userCert);
X509_free(rootCert);
EVP_PKEY_free(rootKey);
return true;
}

/
// 检查公私钥是否配对

BOOL CertPairCheck(char *pubCert,int pubCertLength,
char *priCert,int pricertLength,int format)
{
X509 * theCert=NULL;
EVP_PKEY * theKey=NULL;

theKey=LoadKey(priCert,pricertLength,NULL,format);
theCert=LoadCert(pubCert,pubCertLength,NULL,format);

BOOL ret;
try{ret=X509_check_private_key(theCert,theKey);}
catch(...){ret=false;}
X509_free(theCert);
EVP_PKEY_free(theKey);
return ret;
}

/
// 生成黑名单

BOOL CreateCrl(char *rootPubCert,int rootPubLen,
char *rootPriCert,int rootPriLen,int rootCertFormat,
LPCRLREQ crlInfo,int certNum,int hours,char *crlFile)
{
int ret=1,i=0;

OpenSSL_add_all_algorithms();

EVP_PKEY *pkey=LoadKey(rootPriCert,rootPriLen,NULL,rootCertFormat);
X509 *x509=LoadCert(rootPubCert,rootPubLen,NULL,rootCertFormat);

const EVP_MD *dgst=EVP_get_digestbyname("sha1");

X509_CRL *crl=X509_CRL_new();
X509_CRL_INFO *ci =crl->crl;
X509_NAME_free(ci->issuer);
ci->issuer=X509_NAME_dup(x509->cert_info->subject);

X509_gmtime_adj(ci->lastUpdate,0);
if (ci->nextUpdate == NULL)
ci->nextUpdate=ASN1_UTCTIME_new();
X509_gmtime_adj(ci->nextUpdate,hours*60*60);

if(!ci->revoked)
ci->revoked = sk_X509_REVOKED_new_null();

X509_REVOKED *r = NULL;
BIGNUM *serial_bn = NULL;
char buf[512];

for(i=0;i<certNum;i++)
{
r = X509_REVOKED_new();
ASN1_TIME_set(r->revocationDate,crlInfo[i].RevokeTime);
BN_hex2bn(&serial_bn,ltoa(crlInfo[i].CertSerial,buf,10));
BN_to_ASN1_INTEGER(serial_bn,r->serialNumber);
sk_X509_REVOKED_push(ci->revoked,r);
}

for (i=0; i<sk_X509_REVOKED_num(ci->revoked); i++)
{
r=sk_X509_REVOKED_value(ci->revoked,i);
r->sequence=i;
}

ci->version=ASN1_INTEGER_new();
ASN1_INTEGER_set(ci->version,1);
X509_CRL_sign(crl,pkey,dgst);

BIO *out=BIO_new(BIO_s_file());
if(BIO_write_filename(out,crlFile) > 0)
{
PEM_write_bio_X509_CRL(out,crl);
}
X509V3_EXT_cleanup();

BIO_free_all(out);
EVP_PKEY_free(pkey);
X509_CRL_free(crl);
X509_free(x509);
EVP_cleanup();
return true;
}

/
// 通过黑名单验证证书,验证通过返回真,否则返回假

BOOL CheckCertWithCrl(char *pubCert,int pubCertLen,int certFormat,
char *crlData,int crlLen)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);

BIO * in=NULL;
if(crlLen==0)
{
if((in=BIO_new_file(crlData, "r"))==NULL)
return NULL;
}
else
{
if((in=BIO_new_mem_buf(crlData,crlLen))== NULL)
return NULL;
}
X509_CRL *crl=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL);
STACK_OF(X509_REVOKED) *revoked=crl->crl->revoked;
X509_REVOKED *rc;

ASN1_INTEGER *serial=X509_get_serialNumber(x509);
int num=sk_X509_REVOKED_num(revoked);
bool bf=true;
for(int i=0;i<num;i++)
{
rc=sk_X509_REVOKED_pop(revoked);
if(ASN1_INTEGER_cmp(serial,rc->serialNumber)==0)
bf=false;
}

X509_CRL_free(crl);
X509_free(x509);
EVP_cleanup();
return bf;
}

/
// 通过根证书验证证书

BOOL CheckCertWithRoot(char *pubCert,int pubCertLen,int certFormat,
char *rootCert,int rootCertLen,int rootFormat)
{
OpenSSL_add_all_algorithms();
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
X509 *root=LoadCert(rootCert,rootCertLen,NULL,rootFormat);

EVP_PKEY * pcert=X509_get_pubkey(root);
int ret=X509_verify(x509,pcert);
EVP_PKEY_free (pcert);

X509_free(x509);
X509_free(root);
if(ret==1)
return true;
else
return false;
}

/
// 检查证书有效期,在有效期内返回真,否则返回假

BOOL CheckCertLife(char *pubCert,int pubCertLen,int certFormat,CTime time)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
time_t ct=time.GetTime();
asn1_string_st *before=X509_get_notBefore(x509),
*after=X509_get_notAfter(x509);
ASN1_UTCTIME *be=ASN1_STRING_dup(before),
*af=ASN1_STRING_dup(after);
bool bf;
if(ASN1_UTCTIME_cmp_time_t(be,ct)>=0||ASN1_UTCTIME_cmp_time_t(af,ct)<=0)
bf=false;
else
bf=true;
M_ASN1_UTCTIME_free(be);
M_ASN1_UTCTIME_free(af);
X509_free(x509);
return bf;
}

/
// 从公钥证书和私钥证书中获取RSA密钥对信息,获取结果为PEM编码

void GetRSAKeyPairFromCertFil e(char *pubCert,int pubCertLen,
char *priCert,int priCertLen,
int certFormat,LPRSAKEYPAIR rsa)
{
X509 * theCert=NULL;
EVP_PKEY * priKey=NULL;
BUF_MEM *bptr;
priKey=LoadKey(priCert,priCertLen,NULL,certFormat);
theCert=LoadCert(pubCert,pubCertLen,NULL,certFormat);
EVP_PKEY * pubKey=X509_get_pubkey(theCert);
rsa->Bits=EVP_PKEY_bits(pubKey);

BIO * bcert=BIO_new(BIO_s_mem());
BIO_set_close(bcert, BIO_CLOSE);
PEM_write_bio_RSAPublicKey(bcert,pubKey->pkey.rsa);
BIO_get_mem_ptr(bcert, &bptr);
memcpy(rsa->PublicKey,bptr->da ta,bptr->length);
BIO_free(bcert);

BIO * bkey=BIO_new(BIO_s_mem());
BIO_set_close(bcert, BIO_CLOSE);
PEM_write_bio_PrivateKey(bkey,priKey,NULL,NULL,0,NULL, NULL);
BIO_get_mem_ptr(bcert, &bptr);
memcpy(rsa->PrivateKey,bptr->da ta,bptr->length);
BIO_free(bkey);

X509_free(theCert);
EVP_PKEY_free(priKey);
}

/
// 获取证书的序列号

int GetCertSerialNumber(char *pubCert,int pubCertLen,int certFormat)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
char * stringval = i2s_ASN1_INTEGER(NULL,X509_get_serialNumber(x509));
X509_free(x509);
return atoi(stringval);
}

/
// 获取证书的颁发者名称(全部信息)

CString GetCertIssuer(char *pubCert,int pubCertLen,int certFormat)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
char buf[256];
memset(buf,0,256);
Get_Name(X509_get_issuer_name(x509),buf);
X509_free(x509);
CString str=buf;
return str;
}

/
// 获取证书的主题信息(全部信息),返回主题的字符串形式

CString GetCertSubjectString(char *pubCert,int pubCertLen,int certFormat)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
char buf[256];
memset(buf,0,256);
Get_Name(X509_get_subject_name(x509),buf);
X509_free(x509);
CString str=buf;
return str;
}

/
// 获取证书的签名算法

CString GetCertAlgorithm(char *pubCert,int pubCertLen,int certFormat)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
char buf[256];
memset(buf,0,256);
i2t_ASN1_OBJECT(buf,1024,x509->cert_info->signature->algorithm);
X509_free(x509);
CString str=buf;
return str;
}

/
// 获取证书的有效期

void GetCertLife(char *pubCert,int pubCertLen,int certFormat,
CTime *notBefore,CTime *notAfter)
{
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
asn1_string_st *before=X509_get_notBefore(x509),
*after=X509_get_notAfter(x509);
ASN1_UTCTIME *be=ASN1_STRING_dup(before),
*af=ASN1_STRING_dup(after);

*notBefore=ConvertASN1Time(be);
*notAfter=ConvertASN1Time(af);

M_ASN1_UTCTIME_free(be);
M_ASN1_UTCTIME_free(af);
X509_free(x509);
}

/
// 获取证书的主题信息

int GetCertSubject(char *pubCert,int pubCertLen,int certFormat,
LPCERTSUBJECT subject)
{
X509_NAME_ENTRY *entry;
ASN1_OBJECT *obj;
ASN1_STRING *str;
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
X509_NAME *name=X509_get_subject_name(x509);
int num=X509_NAME_entry_count(name);
int fn_nid;
for(int i=0;i<num;i++)
{
entry=(X509_NAME_ENTRY *)X509_NAME_get_entry(name,i);
obj=X509_NAME_ENTRY_get_object(entry);
str=X509_NAME_ENTRY_get_da ta(entry);
fn_nid = OBJ_obj2nid(obj);
switch(fn_nid)
{
case NID_commonName:
strcpy(subject->CN,LPCSTR(ConvterASN1String(str)));
case NID_stateOrProvinceName:
strcpy(subject->SP,LPCSTR(ConvterASN1String(str)));
case NID_localityName:
strcpy(subject->L,LPCSTR(ConvterASN1String(str)));
case NID_organizationName:
strcpy(subject->O,LPCSTR(ConvterASN1String(str)));
case NID_organizationalUnitName:
strcpy(subject->OU,LPCSTR(ConvterASN1String(str)));
case NID_pkcs9_emailAddress:
strcpy(subject->EMAIL,LPCSTR(ConvterASN1String(str)));
case NID_email_protect:
strcpy(subject->PMAIL,LPCSTR(ConvterASN1String(str)));
case NID_title:
strcpy(subject->T,LPCSTR(ConvterASN1String(str)));
case NID_description:
strcpy(subject->D,LPCSTR(ConvterASN1String(str)));
case NID_givenName:
strcpy(subject->G,LPCSTR(ConvterASN1String(str)));
}
}
X509_free(x509);
return num;
}

/
// 获取证书扩展项目信息

int GetCertExtent(char *pubCert,int pubCertLen,int certFormat,
LPCERTEXT ext)
{
X509_EXTENSION *ex;
ASN1_OBJECT *obj;
int fn_nid;
BIO *bio;
BUF_MEM *bptr;
X509 *x509=LoadCert(pubCert,pubCertLen,NULL,certFormat);
STACK_OF(X509_EXTENSION) *exts=x509->cert_info->extensions;
int count=sk_X509_EXTENSION_num(exts);
for (int i=0; i<count; i++)
{
ex=sk_X509_EXTENSION_value(exts, i);
obj=X509_EXTENSION_get_object(ex);
fn_nid = OBJ_obj2nid(obj);
ext[i].IOID=fn_nid;
bio=BIO_new(BIO_s_mem());
BIO_set_close(bio, BIO_CLOSE);
if(!X509V3_EXT_print(bio, ex, X509_FLAG_COMPAT, 1))
M_ASN1_OCTET_STRING_print(bio,ex->value);
BIO_get_mem_ptr(bio, &bptr);
memcpy(ext[i].VALUE,bptr->da ta,bptr->length);
CString str=ext[i].VALUE;
if(str.Find("..")==0)
{
str=str.Mid(2);
strcpy(ext[i].VALUE,LPCSTR(str));
}
BIO_free(bio);
}
X509_free(x509);
return count;
}

/
// 数字签名

BOOL Sign(char * priCert,int priCertLen,int format,BYTE * input,
long inputLen,BYTE* output,UINT *outputLen)
{
EVP_MD_CTX md_ctx;
EVP_PKEY * priKey;
OpenSSL_add_all_digests();
priKey=LoadKey(priCert,priCertLen,NULL,format);
EVP_SignInit(&md_ctx, EVP_sha1());
EVP_SignUpdate(&md_ctx,input,inputLen);
int ret=EVP_SignFinal (&md_ctx,(BYTE*)output,outputLen,priKey);
EVP_PKEY_free (priKey);
if(ret==1)
return true;
else
return false;
}

/
// 签名验证

BOOL Verify(char *pubCert,int pubCertLen,int format,
BYTE *input,UINT inputLen,BYTE *sign,UINT signLen)
{
OpenSSL_add_all_digests();
X509 * x509=LoadCert(pubCert,pubCertLen,NULL,format);
EVP_PKEY * pcert=X509_get_pubkey(x509);
EVP_MD_CTX md_ctx;
EVP_VerifyInit (&md_ctx, EVP_sha1());
EVP_VerifyUpdate (&md_ctx,input, inputLen);
int ret=EVP_VerifyFinal (&md_ctx, sign, signLen, pcert);
EVP_PKEY_free (pcert);
X509_free(x509);
if(ret==1)
return true;
else
return false;
}

// 转换私钥编码格式        BOOL ConvertKeyFormat(char *oldKey,int oldKeyLen,int oldFormat,     char *newKeyFile,int newFormat)    {     EVP_PKEY *key=NULL;     BIO *biout=NULL;     int ret;
——自己写的时候没有发现好的文章,写完之后发现好文章赶紧保存下来。 转发自:https://blog.csdn.net/ghevinn/article/details/12909557 // CA.cpp : Defines the entry point for the DLL application. #define sprintf_s sprint...
最近想了解一下gmssl生成 证书 的流程,首先就来体验一下用指令完整 证书 的生成操作。目前,有一些文章已经有相关的详细介绍,但还是存在一定问题,如:CA密钥名与openssl中默认的cakey.pem不一致,导致 证书 生成失败;等。提前安装好gmssl;查看gmssl版本指令 `gmssl version` 本文章使用的gmssl 2.5.4. 13.1  ASN1简介 ANS.1(Abstract Syntax Notation One, X.208),是一套灵活的标记语言,他允许定义多种数据类型,从integer、bit string、一类的简单类型到结构化类型,如set和sequence,并且可以使用这些类型构建复杂类型。 DER编码是ANS.1定义的将对象描述数据编码成8位串值的编码规则,他给出了对ANS.1值(对象的类... 常见 的窗 函数 包括矩形窗、汉明窗、汉宁窗和布莱克曼窗等。这些窗 函数 在信号 处理 中常用于频谱分析、滤波器设计和数据窗间的相互转换。 在MATLAB中,可以使用window 函数 实现 常见 函数 。例如,对于矩形窗,可以使用MATLAB中的rectwin 函数 实现 。具体的 实现 代码如下: n = 256; % 窗 函数 长度 w = rectwin(n); % 矩形窗 函数 长度 plot(w); xlabel('样本序号'); ylabel('幅度'); title('矩形窗 函数 '); 对于汉明窗,可以使用MATLAB中的hamming 函数 实现 。具体的 实现 代码如下: n = 256; % 窗 函数 长度 w = hamming(n); % 汉明窗 函数 长度 plot(w); xlabel('样本序号'); ylabel('幅度'); title('汉明窗 函数 '); 对于汉宁窗,可以使用MATLAB中的hann 函数 实现 。具体的 实现 代码如下: n = 256; % 窗 函数 长度 w = hann(n); % 汉宁窗 函数 长度 plot(w); xlabel('样本序号'); ylabel('幅度'); title('汉宁窗 函数 '); 对于布莱克曼窗,可以使用MATLAB中的blackman 函数 实现 。具体的 实现 代码如下: n = 256; % 窗 函数 长度 w = blackman(n); % 布莱克曼窗 函数 长度 plot(w); xlabel('样本序号'); ylabel('幅度'); title('布莱克曼窗 函数 '); 以上是 常见 函数 的MATLAB 实现 方法,通过给定窗 函数 的长度,可以得到对应的窗 函数 序列,并进行绘制和使用。在实际应用中,可以根据需要选择合适的窗 函数 来进行信号 处理 和频谱分析等操作。 ### 回答2: 常见 的窗 函数 有矩形窗、三角窗、汉宁窗、汉明窗和布莱克曼窗等。下面以Matlab为例,介绍这几种窗 函数 实现 方法。 1. 矩形窗: rectwin 函数 可以直接生成一个长度为N的矩形窗。 ```matlab N = 256; % 窗长度 w = rectwin(N); 2. 三角窗: triang 函数 可以生成一个长度为N的三角窗。 ```matlab N = 256; % 窗长度 w = triang(N); 3. 汉宁窗: hann 函数 可以生成一个长度为N的汉宁窗。 ```matlab N = 256; % 窗长度 w = hann(N); 4. 汉明窗: hamming 函数 可以生成一个长度为N的汉明窗。 ```matlab N = 256; % 窗长度 w = hamming(N); 5. 布莱克曼窗: blackman 函数 可以生成一个长度为N的布莱克曼窗。 ```matlab N = 256; % 窗长度 w = blackman(N); 生成的窗 函数 存储在向量w中,可以与要 处理 的信号进行加窗 处理 ,以改善频谱分析结果或者减小频谱泄漏等问题。 ### 回答3: 常见 的窗 函数 包括矩形窗、汉宁窗、汉明窗和布莱克曼窗等。 矩形窗是最简单的窗 函数 ,其 实现 代码如下: ``` matlab function w = rectwin(N) w = ones(N, 1); 汉宁窗是一种典型的平滑窗 函数 ,其 实现 代码如下: ``` matlab function w = hann(N) L = N - 1; n = 0:L; w = 0.5 * (1 - cos(2 * pi * n / L))'; 汉明窗也是一种经典的窗 函数 ,其 实现 代码如下: ``` matlab function w = hamming(N) L = N - 1; n = 0:L; w = 0.54 - 0.46 * cos(2 * pi * n / L)'; 布莱克曼窗是一种用于减小频谱泄露的窗 函数 ,其 实现 代码如下: ``` matlab function w = blackman(N) L = N - 1; n = 0:L; w = 0.42 - 0.5 * cos(2 * pi * n / L) + 0.08 * cos(4 * pi * n / L)'; 以上是 常见 函数 的简单 实现 代码。在Matlab中,我们可以通过这些代码生成对应的窗 函数 序列,并应用于信号 处理 、频谱分析等场景中。 Maven 报:Could not find artifact org.apache.maven.plugins:maven-resources-plugin:pom:2.4.3 27711 Maven 报:Could not find artifact org.apache.maven.plugins:maven-resources-plugin:pom:2.4.3 不喜温故: 牛,我不删除其他镜像也可以 Activiti 浅谈并发处理 wuyulunbi11: 大佬找到作者了么?我也想请教下 自动驾驶中行为预测的一些根本问题和最新方法一 文献在哪里