Python 数字信号处理程序实现求解

Python013

Python 数字信号处理程序实现求解,第1张

数字信号处理是把信号用数字或符号表示成序列,通过计算机或通用(专用)信号处理设备,用数值计算方法进行各种处理,达到提取有用信息便于应用的目的。例如:滤波、检测、变换、增强、估计、识别、参数提取、频谱分析等。

一般地讲,数字信号处理涉及三个步骤:

⑴模数转换(A/D转换):把模拟信号变成数字信号,是一个对自变量和幅值同时进行离散化的过程,基本的理论保证是采样定理。

⑵数字信号处理(DSP):包括变换域分析(如频域变换)、数字滤波、识别、合成等。

⑶数模转换(D/A转换):把经过处理的数字信号还原为模拟信号。通常,这一步并不是必须的。 作为DSP的成功例子有很多,如医用CT断层成像扫描仪的发明。它是利用生物体的各个部位对X射线吸收率不同的现象,并利用各个方向扫描的投影数据再构造出检测体剖面图的仪器。这种仪器中fft(快速傅里叶变换)起到了快速计算的作用。以后相继研制出的还有:采用正电子的CT机和基于核磁共振的CT机等仪器,它们为医学领域作出了很大的贡献。

信号处理的目的是:削弱信号中的多余内容;滤出混杂的噪声和干扰;或者将信号变换成容易处理、传输、分析与识别的形式,以便后续的其它处理。 下面的示意图说明了信号处理的概念。

1.读取wav文件

# -*- coding: utf-8 -*-

import wave

import pylab as pl

import numpy as np

# 打开WAV文档

f = wave.open(r"c:\WINDOWS\Media\ding.wav", "rb")

# 读取格式信息

# (nchannels, sampwidth, framerate, nframes, comptype, compname)

params = f.getparams()

nchannels, sampwidth, framerate, nframes = params[:4]

# 读取波形数据

str_data = f.readframes(nframes)

f.close()

#将波形数据转换为数组

wave_data = np.fromstring(str_data, dtype=np.short)

wave_data.shape = -1, 2

wave_data = wave_data.T

time = np.arange(0, nframes) * (1.0 / framerate)

# 绘制波形

pl.subplot(211)

pl.plot(time, wave_data[0])

pl.subplot(212)

pl.plot(time, wave_data[1], c="g")

pl.xlabel("time (seconds)")

pl.show()

2.观察信号频谱

# -*- coding: utf-8 -*-

import numpy as np

import pylab as pl

sampling_rate = 8000

fft_size = 512

t = np.arange(0, 1.0, 1.0/sampling_rate)

x = np.sin(2*np.pi*156.25*t) + 2*np.sin(2*np.pi*234.375*t)

xs = x[:fft_size]

xf = np.fft.rfft(xs)/fft_size

freqs = np.linspace(0, sampling_rate/2, fft_size/2+1)

xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e100))

pl.figure(figsize=(8,4))

pl.subplot(211)

pl.plot(t[:fft_size], xs)

pl.xlabel(u"时间(秒)")

pl.title(u"156.25Hz和234.375Hz的波形和频谱")

pl.subplot(212)

pl.plot(freqs, xfp)

pl.xlabel(u"频率(Hz)")

pl.subplots_adjust(hspace=0.4)

pl.show()

这两条命令执行的是不一样的

前者是使用python 执行*.py 缺少模块就是说你python没装全 把该加的模块加进去就可以了

后者使用的是shell命令执行*.py只要系统没出现大问题 应该是都可以执行的