Python 은 scipy.fft 를 사용 하여 대학 고전 푸 립 엽 변환 을 진행 합 니 다.
푸 립 엽 변환
우 리 는 평소에 어떻게 복잡 한 문 제 를 분해 합 니까?하나의 전형 적 인 방법 은 바로 이 복잡 한 문 제 를 여러 개의 간단 하고 조작 가능 한 서브 문제 로 분해 하 는 것 이다.푸 립 엽 의 변환 도 이 사상 을 바탕 으로 한다.
푸 리 엽 분석 은 수학 함 수 를 어떻게 일련의 더 간단 한 삼각함수 로 분해 하 는 지 연구 하 는 분야 이다.푸 리 엽 변환 은 이 분야 의 도구 로 함 수 를 그 분량 의 주파수 로 분해 하 는 데 사용 된다.
본 튜 토리 얼 에서 푸 립 엽 변환 은 일종 의 도구 로 신 호 를 얻 고 그 중의 모든 주파수 의 출력 을 볼 수 있다.이 푸 립 엽 변환 중의 중요 한 용 어 를 보 세 요.
첫 번 째 는 저주파 사인 파 이 고,두 번 째 는 고주파 사인 파 이 며,세 번 째 는 저주파 저 출력 사인 파 이기 때문에 저 출력 사인 파 는 다른 두 사인 파 의 봉 보다 작다.
시간 영역 과 주파수 영역
시간 영역 과 주파수 영역 은 신 호 를 보 는 두 가지 다른 방식,즉 신호 의 구성 빈도 나 시간 에 따라 변화 하 는 정보 이다.
시간 영역 에서 신 호 는 시간(x 축)폭(y 축)에 따라 변화 하 는 파 이다.시간 영역 에서 도 표를 볼 수 있 습 니 다.예 를 들 어:
이것 은 일부 오디 오 그림 입 니 다.이것 은 시간 영역 신호 입 니 다.가로 축 은 시간 을 나타 내 고 세로 축 은 진폭 을 나타 낸다.
주파수 영역 에서 신 호 는 일련의 주파수(x 축)를 나타 내 고 모든 주파수 가 관련 된 출력(y 축)을 가진다.다음 그림 은 푸 립 엽 을 거 쳐 상기 오디 오 신호 입 니 다.
코드 구현 사인 파
오디 오 는 본질 적 으로 사인 파 이다.
다음은 사인 파 를 만 드 는 코드 입 니 다.
import numpy as np
from matplotlib import pyplot as plt
SAMPLE_RATE = 44100 #
DURATION = 5 #
def generate_sine_wave(freq, sample_rate, duration):
x = np.linspace(0, duration, sample_rate * duration, endpoint=False)
frequencies = x * freq
y = np.sin((2 * np.pi) * frequencies)
return x, y
# 5 2
x, y = generate_sine_wave(2, SAMPLE_RATE, DURATION)
plt.plot(x, y)
plt.show()
x 축 은 초 단위 로 시간 을 표시 하고 매 초 에 두 개의 피크 가 있 기 때문에 사인 파 가 1 초 에 두 번 진동 하 는 것 을 볼 수 있다.
혼합 오디 오
다음은 두 개의 사인 파 를 혼합 오디 오 신 호 는 두 단계 만 포함 합 니 다.
사인 파 를 합 쳐 귀 일 화 된 조작 을 한다.
구체 적 으로 실 현 된 코드 는 다음 과 같다.
_, nice_tone = generate_sine_wave(400, SAMPLE_RATE, DURATION)
_, noise_tone = generate_sine_wave(4000, SAMPLE_RATE, DURATION)
noise_tone = noise_tone * 0.3
mixed_tone = nice_tone + noise_tone
다음 단 계 는 대상 형식 에 맞 게 정규 화 되 거나 신 호 를 크기 조정 하 는 것 입 니 다.앞으로 오디 오 를 어떻게 저장 할 것 인지,목표 형식 은 16 비트 정수 이 며,범 위 는-32768 에서 32767 입 니 다.
normalized_tone = np.int16((mixed_tone / mixed_tone.max()) * 32767)
plt.plot(normalized_tone[:1000])
plt.show()
보 이 는 사인 파 는 생 성 된 400 Hz 음조 로 위의 사인 파 를 오디 오 로 바 꾸 고,가장 쉬 운 방법 은
SciPy
의wavfile.write
방법 으로WAV
파일 에 저장 하 는 것 이다.16 비트 정 수 는 WAV 파일 의 표준 데이터 형식 이기 때문에 신 호 를 16 비트 정수 로 표준화 해 야 합 니 다.
from scipy.io.wavfile import write
# , =44100
write("mysinewave.wav", SAMPLE_RATE, normalized_tone)
이 오디 오 는 듣 기 에 음조 가 매우 높다.
이 절 차 를 마 친 후 오디 오 샘플 로 삼 았 다.다음 단 계 는 푸 립 엽 변환 으로 고음 조 를 없 애 는 것 입 니 다!
푸 립 엽 변환
현재 생 성 된 오디 오 에 FFT 를 사 용 했 습 니 다.FFT 는 푸 립 엽 변환 을 실현 하고 시간 영역 에서 신호 로 스펙트럼 을 계산 할 수 있 는 알고리즘 이다.
from scipy.fft import fft, fftfreq
#
N = SAMPLE_RATE * DURATION
yf = fft(normalized_tone)
xf = fftfreq(N, 1 / SAMPLE_RATE)
plt.plot(xf, np.abs(yf))
plt.show()
우 리 는 정 주파수 에서 두 개의 피크 수 치 를 볼 수 있다.정 주파수 피크 수 치 는 400 Hz 와 4000 Hz 에 위치 하고 이전에 생 성 된 오디 오의 주파수 와 대응 된다.
계산 푸 리 엽 변환
yf = fft(normalized_tone)
xf = fftfreq(N, 1 / SAMPLE_RATE)
위 코드 기능
from scipy.fft import rfft, rfftfreq
# “r”
yf = rfft(normalized_tone)
xf = rfftfreq(N, 1 / SAMPLE_RATE)
plt.plot(xf, np.abs(yf))
plt.show()
여과 신호
푸 리 엽 변환 의 큰 장점 은 역 효 과 를 가 진 다 는 것 이다.우 리 는 이 장점 을 이용 하여 오디 오 를 걸 러 내 고 고음 주파 수 를 벗 어 날 수 있다.
#
points_per_freq = len(xf) / (SAMPLE_RATE / 2)
# 4000 44100 4000
target_idx = int(points_per_freq * 4000)
그리고 yf 를 0 목표 주파수 근처 의 index 로 설정 하여 벗 어 날 수 있 습 니 다.
yf[target_idx - 1 : target_idx + 2] = 0
plt.plot(xf, np.abs(yf))
plt.show()
하나의 고봉 만 있 기 때문에,아래 에 부 립 엽 역 변환 을 응용 하여 시역 으로 돌아간다.
역 FFT 를 사용 하 는 것 과 FFT 를 사용 하 는 것 이 비슷 합 니 다:
from scipy.fft import irfft
new_sig = irfft(yf)
plt.plot(new_sig[:1000])
plt.show()
rfft()를 사용 하고 있 기 때문에 irfft()를 사용 하여 반 함 수 를 적용 해 야 합 니 다.단,fft()를 사용 한 적 이 있다 면 반 함 수 는 ifft()입 니 다.현재 그림 은 다음 과 같 아야 합 니 다.현재 400 Hz 로 진동 하 는 사인 파 가 있 고 4000 Hz 의 소음 을 제거 하 는 데 성공 했다.
신 호 를 획일 화하 고 파일 에 기록 합 니 다.
norm_new_sig = np.int16(new_sig * (32767 / new_sig.max()))
write("clean.wav", SAMPLE_RATE, norm_new_sig)
파 이 썬 이 scipy.fft 를 사용 하여 대학의 전형 적 인 푸 립 엽 변환 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 푸 립 엽 변환 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.