Python 은 scipy.fft 를 사용 하여 대학 고전 푸 립 엽 변환 을 진행 합 니 다.

푸 리 엽 변환 은 고수 에서 매우 중요 한 지식 점 으로 오늘 은 Python 코드 와 결합 하여 푸 리 엽 변환 을 실현 할 것 이다.
푸 립 엽 변환
우 리 는 평소에 어떻게 복잡 한 문 제 를 분해 합 니까?하나의 전형 적 인 방법 은 바로 이 복잡 한 문 제 를 여러 개의 간단 하고 조작 가능 한 서브 문제 로 분해 하 는 것 이다.푸 립 엽 의 변환 도 이 사상 을 바탕 으로 한다.
푸 리 엽 분석 은 수학 함 수 를 어떻게 일련의 더 간단 한 삼각함수 로 분해 하 는 지 연구 하 는 분야 이다.푸 리 엽 변환 은 이 분야 의 도구 로 함 수 를 그 분량 의 주파수 로 분해 하 는 데 사용 된다.
본 튜 토리 얼 에서 푸 립 엽 변환 은 일종 의 도구 로 신 호 를 얻 고 그 중의 모든 주파수 의 출력 을 볼 수 있다.이 푸 립 엽 변환 중의 중요 한 용 어 를 보 세 요.
  • 신호:신 호 는 시간 에 따라 변화 하 는 정보 이다.예 를 들 어 오디 오,영상 과 전압 의 주 행 선 은 모두 신호 의 예 이다.
  • 주파수:주파 수 는 어떤 물건 이 중복 되 는 속도 이다.예 를 들 어 시 계 는 1 헤르츠(Hz)주파수 로 똑 딱 거리 거나 1 초 에 1 번 반복 된다.
  • 출력:출력 은 모든 주파수 의 강 도 를 나타 낸다.
  • 다음 그림 은 사인 파 의 주파수 와 출력 에 대한 직관 적 인 표현 이다.

    첫 번 째 는 저주파 사인 파 이 고,두 번 째 는 고주파 사인 파 이 며,세 번 째 는 저주파 저 출력 사인 파 이기 때문에 저 출력 사인 파 는 다른 두 사인 파 의 봉 보다 작다.
    시간 영역 과 주파수 영역
    시간 영역 과 주파수 영역 은 신 호 를 보 는 두 가지 다른 방식,즉 신호 의 구성 빈도 나 시간 에 따라 변화 하 는 정보 이다.
    시간 영역 에서 신 호 는 시간(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 음조 로 위의 사인 파 를 오디 오 로 바 꾸 고,가장 쉬 운 방법 은SciPywavfile.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)
    
    위 코드 기능
  • fft()계산 전환 자체.
  • fftfreq()가 계산 한 출력 에서 각 창고 중심의 주파수 fft().이것 이 없 으 면 스펙트럼 에 x 축 을 그 릴 수 없습니다
  • fft()출력의 스펙트럼 은 y 축 을 둘러싸 고 반사 되 기 때문에 음 반 부분 은 정반 부분의 경상 이다.우 리 는 일반적으로 절반 의 대칭 값 만 계산 하면 부 립 엽 변환 을 더욱 빨리 할 수 있다.scipy.fft 는 이 속도 로 해 킹 rfft()를 실시 합 니 다.
    
    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 를 사용 하여 대학의 전형 적 인 푸 립 엽 변환 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 푸 립 엽 변환 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기