Mar-27-2018, 02:52 PM
Hi everyone,
First of all thank you for taking time to read this. I assure you that I looked at all posts I could find, and other sources, but I can't find what I what so I post here my issue.
I am totally new to python, so I tried to read and learn what I could but I cannot seem to do what I want. My aim is to create a wave file of brown noise with amplitude modulation at a given frequency. From what I saw on the internet I have two possibilities: (I) generate brown noise and modulate it, or (II) get a brown noise wave file and modulate it. My problems are:
1) One of the options should be to choose the duration (i.e. the number of periods of the modulation frequency generated). For 1 second it generates a wave file of 1s, but for 3 seconds it generates a 5 seconds file, and for 5 seconds it generates a 9 seconds file! I don't get it...
2) I want to have a modulation frequency defined by the user, unfortunately, I don't have any mean to make sure that the frequency defined is really the final idea. Is there something to plot the signal?
3) I intended to use the python acoustics package, unfortunately I don't understand how to use the functions to create colored noise. I looked at the examples, but I don't see examples on colored noises functions use.
4) Maybe the idea (II) would be easier to use: import a brown noise file, cut to the duration I want and modulate with my frequency. Unfortunately I don't get how to modulate wave files frame by frame. Any idea?
Thank you if you have any tips for this, I am really struggling on this one. Please find below my code.
Pyxel
----------------------------
Here is my code:
First of all thank you for taking time to read this. I assure you that I looked at all posts I could find, and other sources, but I can't find what I what so I post here my issue.
I am totally new to python, so I tried to read and learn what I could but I cannot seem to do what I want. My aim is to create a wave file of brown noise with amplitude modulation at a given frequency. From what I saw on the internet I have two possibilities: (I) generate brown noise and modulate it, or (II) get a brown noise wave file and modulate it. My problems are:
1) One of the options should be to choose the duration (i.e. the number of periods of the modulation frequency generated). For 1 second it generates a wave file of 1s, but for 3 seconds it generates a 5 seconds file, and for 5 seconds it generates a 9 seconds file! I don't get it...
2) I want to have a modulation frequency defined by the user, unfortunately, I don't have any mean to make sure that the frequency defined is really the final idea. Is there something to plot the signal?
3) I intended to use the python acoustics package, unfortunately I don't understand how to use the functions to create colored noise. I looked at the examples, but I don't see examples on colored noises functions use.
4) Maybe the idea (II) would be easier to use: import a brown noise file, cut to the duration I want and modulate with my frequency. Unfortunately I don't get how to modulate wave files frame by frame. Any idea?
Thank you if you have any tips for this, I am really struggling on this one. Please find below my code.
Pyxel
----------------------------
Here is my code:
""" This file proposes to modulate a given wav file""" import wave import struct import time import math import random import acoustics ########################################### # General variables frequencyModulation = 40 period = 1/frequencyModulation duration = 1 maxVolume = 23000.0 ########################################### # Ask the user about the modulation frequency wanted temp = "" temp = input("Modulation frequency wanted:") if temp != "": frequencyModulation = int(temp) period = 1/frequencyModulation # Ask the user about the duration wanted temp = "" temp = input("Duration wanted:") if temp != "": duration = int(temp) print("------------------------") ########################################### # Open the original wave file originalWaveFile = wave.open("brownNoise.wav", "r") newWaveFile = wave.open("waveXP.wav", "w") # Compute how many frame does one period take nPeriodFrames = int(period*originalWaveFile.getframerate()) print("Real modulation frequency is %s" % (originalWaveFile.getframerate()/nPeriodFrames)) print(nPeriodFrames) # Get one period of frames periodFrames = originalWaveFile.readframes(nPeriodFrames) print(len(periodFrames)) # Copy parameters but set to mono newWaveFile.setparams(originalWaveFile.getparams()) newWaveFile.setnchannels(1) # Calculate the number of repetitions of the period repetitions = 1 if duration/period > 1: repetitions = int(duration*originalWaveFile.getframerate()/nPeriodFrames) print(repetitions) # Loop for how many repetitions as requested for j in range(1, repetitions): for i in range(1, nPeriodFrames): # Calculate the sin function for amplitude modulation volume = maxVolume*(math.sin((2*math.pi*i/len(periodFrames)-math.pi/2))+1)/2 # Single tone #newWaveFile.writeframes(struct.pack('<h', int(volume*math.cos(440*math.pi*float(i)/float(originalWaveFile.getframerate()))))) # White noise newWaveFile.writeframes(struct.pack('<h', int(volume*random.random()))) # Brown noise #newWaveFile.writeframes(struct.pack('<h', int(volume*acoustics.generator.brown(1)))) ########################################### # Get a one period long segment of the wave file # Close wave files originalWaveFile.close() newWaveFile.close()