Using QGIS + GRASS plugin:
Add the Grass toolbar from the "Manage Plugins" window.
Your lines will need to be a grass vector, so convert them into a new or existing GRASS mapset.
From the GRASS toolbar, select GRASS Tools...
Look for the module: v.generalize (WIKI tutorial here)
You can then choose several different generalizing algorithms:
Note the algorithms: Chaiken, Hermite or even Sliding Average. There are several others as well!
The differences can be seen in the wiki pictures:
from Wiki: "Note, that a difference between "Chaiken" and "Hermite" is that the lines produced by "Chaiken" "inscribe" the orginal lines whereas the "Hermite" lines "circumscribe" the original lines as can be seen in the picture [above]. (Black line is original line, green line is "Chaiken" and blue is "Hermite")
Using uDig + jgrasstools or grass:
If you have difficulty getting desirable results from GRASS's v.generalize, try the latest version of uDig with jgrasstools. You can also grab the grass jar from the same place as jgrasstools.
Once uDig is installed and up and running, enable the Spatial Toolbox:
Window > Show View > Other...
Un-dock the toolbar for easier readability (right-click Spatial Toolbox tab > Detach...):
Load the required jgrasstools and grass (optional) modules:
Don't forget to set your grass parameters (point to grass executable or bat file on windows, or grass command in linux ie, /usr/bin/grass) if you load the grass jar file as well:
Finally! Using the tools from jgrasstools (not grass) you can generalize the line easily with Vector Processing > LineSmootherJaiTools
Be sure to set the input and output properly (works on Shapefiles only, so no need to convert your data to mapsets/locations for grass):
Once done setting the smoothing tolerance (0.0 - 1.0) and input/output, press the Play button on the Spatial Toolbox window (top right):
Results: